티스토리 뷰

Xcode

[Xcode] Xcode Concepts 정리

Hani_Levenshtein 2022. 3. 14. 04:56

안녕하세요 Hani입니다.

 

흠 🥺

요즘 글이 잘 안 써져서 조금 맘이 아프네욥

내 블로그.. 

 

 

 

1. Xcode Project(.xcodeproj)

2. pbxproj

3. Xcode Workspace(.xcworkspace)

4. Xcode Target

5. Build Settings

6. Xcode Scheme(.xcscheme)

 


Xcode Project(.xcodeproj)

Project는 하나 이상의 Product를 build하기 위해 필요한 모든 파일과 리소스 및 정보를 담고 있는 저장소예요.

 

 

.m, .swift 등의 구현 파일과 .h 헤더 파일,

라이브러리와 프레임워크,

리소스 및 이미지 파일,

nib 파일

등의 소스 파일에 대한 참조 정보를 가지고 있습니다.

 

 

Project에서는 Build Settings를 정의할 수 있는데,

이 Build Settings는 Project의 모든 Target들에게 적용됩니다.

(후술 하겠지만 모든 Target은 Project의 Build Settings를 재정의할 수 있습니다.)

 

 

 

.xcodeproj 디렉토리를 들여다보면

.pbxproj와 .xcworkspace를 볼 수 있습니다.

차례대로 알아볼 거예요. ☺️

 

 

 


.pbxproj

.pbxproj는 프로젝트에 관한 모든 정보를 저장하고 있으며

16진 해시 형태의 객체의 Identifier를 추적하여 section이라는 의미 있는 단위로 관리하는 파일입니다.

 

 

 

 

 

.pbxproj 파일 상단의 objects에서 프로젝트의 모든 정보가 들어가 있으며

objects에는 여러 section을 가지고 있습니다.

 

 

 

 

 

 

section은 대략 이런 구조를 따르고 있어요.

 

중요한 점은 .pbxproj 파일은 깃 충돌을 일으키는 대표적인 파일이라는 것입니다.

파일을 생성, 이동, 삭제 등을 했을 때 pbxproj 파일에 바로 반영이 되는데

두 브랜치에서 다른 작업을 할 경우 pbxproj 파일도 서로 달라지게 되어 충돌이 나게 됩니다.  🥺

 

따라서 pbxproj 파일은 따로 관리를 해줄 필요가 있어요.

 

 

 


Xcode Workspace(.xcworkspace)

 

Workspace는 프로젝트와 다른 문서들을 묶어서 함께 동작할 수 있도록 만드는 Xcode Document입니다.

Workspace에 포함된 프로젝트들은 서로의 프로젝트에 접근할 수 있습니다.

 

프로젝트를 만들면 .xcodeproj가 생성되고

.xcodeproj 디렉토리 내에 .xcworkspace가 있는 것을 위에서 확인했었죠?

 

 

 

.xcworkspace의 내부를 확인해보면

.xcworkspacedata에는 워크스페이스가 참조하고 있는 프로젝트를 확인할 수 있습니다.

 

self, 그러니까 App이라는 프로젝트 자신을 참조하고 있네요.

 

 

 

만약 워크스페이스가 여러 프로젝트를 갖도록 만들고 싶다면

Xcode - File - New - Workspace에서 생성해줄 수 있습니다.

 

저는 CustomWorkSpace라는 이름으로 생성해줬어요.

빈 공간에 .xcdeproj을 끌어다 놓으면 됩니다.

 

 

 

요로케

 

 

 

두 개를 끌어다 놓으면 이런 식으로 볼 수 있습니다.

 

 

 

 

.xcworkspacedata를 확인해보면 App2 폴더, App 폴더에 있는 .xcodeproj를 참조하고 있는 것을 확인할 수 있어요.

 

 

 


Xcode Target

Target은 build할 Product를 지정하고

Project나 Workspace 내의 파일들로부터 Product를 build하기 위한 정보(Build Settings, Build Phase)를 가지고 있습니다.

 

 

 

Project에 속한 Target들은 Project의 Build Settings를 상속받고 있지만

상속받은 Build Settings는 각 Target에서 재정의 할 수 있어요.

 

 

 

 

또한, 한 Target은 다른 Target과의 관계가 형성될 수 있습니다.

 

만약 Target A가 Product를 build 하기 위해

다른 Target B의 결과를 필요로 한다면

Target A는 Target B에 의존하고 있다고 말합니다.

 

두 Target이 같은 Workspace에 존재한다면

Xcode는 이러한 의존성을 발견할 수 있어서

의존성 순서대로 Xcode가 Product를 build해줍니다. (선 B 후 A)

 

이런 의존성 관계를 Implicit Dependency라고 해욥.

 

 

 

 

 

Implicit Dependency를 사용하기 위해선

Xcode - Project - Target - Build Phases - Link Binary With Library에 라이브러리를 추가하고

 

 

 

 

 

Xcode - Product - Edit Scheme - Build - Build Options - Find Implicit Dependencies를 체크하면 됩니다.

 

 

 

 

만약 두 Target이 Implicit Dependency를 가지고 있지 않지만 Xcode가 그렇다고 판단할 수도 있는데

이걸 막으려면 Build Settings에서 Explicit Dependency를 지정할 수도 있습니다.

(Explicit Dependency는 Implicit Dependency를 재정의하는 관계입니다.)

 

 

 

예를 들면 한 라이브러리와, 그 라이브러리와 링크되는 앱이

동일한 워크스페이스에서 빌드된다면

Xcode는 이 점을 발견하고 라이브러리를 먼저 빌드할 거예요.

 

하지만 워크스페이스에서 빌드된 버전의 라이브러리가 아니라

다른 버전의 라이브러리와 링크하려는 경우에 Explicit Dependency를 갖게 만들 수 있답니다. ☺️

 

 

 

Explicit Dependency를 사용하기 위해선

Xcode - Project - Target - Dependencies에 추가하면 됩니다.

 

 

 


Build Settings

Build Settings는 프로덕트의 Build Process가 어떻게 수행되어야 할지에 대한 정보를 가진 변수예요.

 

위에서 말했듯 Build Settings은 Project Level에서 설정하면 모든 Target에 적용이 되고,

각 Target에서 재정의를 통해 변경시킬 수도 있습니다.

 

각 Target은 한 프로덕트를 build하기 위해 필요한 소스 파일을 구성하며,

Build Configuration은 Target의 프로덕트를 build하기 위해 사용되는 Build Settings를 지정합니다.

예를 들면 프로덕트의 Debug와 Release Build를 위한 분리된 Build Configuration을 갖는 게 보통이에요.

 

 

 

 

 

프로젝트 혹은 타겟에는 사용자 정의 혹은 조건부 Build Settings를 추가로 생성할 수 있습니다.

 

조건부 Build Settings 값은 하나 이상의 전제 조건을 만족시키는지에 달려있는데,

예를 들면, i386, ARM 등 아키텍쳐에 기반한 프로덕트를 빌드하는 데 사용할 SDK를 지정할 수 있습니다.

 

 

 

 

저 Add Conditional Setting을 활성화하려면 특정 Build Configuration을 선택한 상태여야 해요.

V 표시 화살표를 누르면 Build Configuration를 선택할 수 있는데

+ 표시나 Add Conditional Setting를 누르면..!

 

 

 

 

Conditional Setting 쌉가능

 

 

 

 


Xcode Scheme(.xcscheme)

Scheme은 build할 Target들, build할 때 사용할 Configuration, 실행할 Test들을 정의하는 곳입니다.

 

 

 

 

Scheme은 한 번에 하나의 Active Target만 가질 수 있습니다.

 

 

 

Scheme은 프로젝트의 런타임에 일어날 일을 설정하는데,

대표적으로 Build Configuration을 정할 수 있습니다.

 

기본적으로 Debug와 Release가 주어지며

Profile과 Archive할 때는 Release를 쓰고 있네요.

 

Build, Run 부터 Archive까지 각각 하나의 Scheme을 선택할 수 있는데,

선택된 Scheme을 Active Scheme이라고 합니다.

 

 

 

 

Xcode - Project - Info에서는 Debug와 Release 외에 다른 Build Configuration을 정의할 수도 있습니다.

화살표가 가리키는 + 버튼을 눌러서 아무거나 복사한 후에 이름을 바꿔주면  

 

 

 

기존에 없던 Build Configuration를 생성할 수 있습니다.

 

 

 

Xcode - Product - Edit Scheme으로 가보면

새로 생성된 Build Configuration를 확인할 수 있습니다.

 

 

 


References

https://stackoverflow.com/questions/1211854/xcode-conditional-build-settings-based-on-architecture-device-arm-vs-simulat

https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Targets.html#//apple_ref/doc/uid/TP40009328-CH4-SW1

'Xcode' 카테고리의 다른 글

[Xcode] Explore UI animation hitches and the render loop 정리  (0) 2022.06.10
[Xcode] Bundle  (0) 2022.05.15
댓글