Tuist 도입 전 Target, project, workspace 에 대한 공부!
Tuist를 먼저 공부하기 전 알아야 할 개념들을 먼저 정리해보았다.
Xcode Target의 의미
Project나 Workspace의 파일들을 Build 하여 생성되는 End Product 를 의미한다. End Product는 앱이 될 수도 있고, Framework가 될 수도 있고, Unit Test 번들 이 될 수도 있다.
또한 프로젝트에는 하나 이상의 Target 이 포함될 수 있으며, 각 타겟은 하나의 제품을 생성한다!
Target은 product 를 빌드하기 위해, project, workspace 안의 파일들을 (소스파일) 과 그 소스파일을 처리하는 명령 (Build setting, Build phase) 들을 보고 End product 를 생성한다.
즉 Project 와 workspace 에 소스파일과 빌드 세팅 -> , 빌드를 한 후 End Product 가 생성
중요한 점
- Target은 Project build setting을 상속 -> 즉 PROJECT에도 Build setting 이 있다.
- 기본적으로 Target 의 build setting 은 Project 빌드 세팅을 따라가지만, 원한다면 타겟의 빌드 세팅을 재정의 (override) 할 수 있다.
- 같은 Workspace안에 있는 target 은 서로 의존할 수 있다. (예를 들어 써드파티 라이브러리의 경우) 그리고 이런 경우에, Xcode가 알아서 의존성을 발견하고 필요한 순서대로 target을 build 한다 (Implicit dependency)
- Build setting 에서 명시적으로 종속성을 설정할 수 있다.
)
위 사진과 같이 Project Level 의 Build setting 이 존재한다. 또한 아래 사진과 같이 Target도 별도로 Build setting 가질 수 있다. 만약 Target 의 Build setting 을 재정의하지 않으면 Project level 의 빌드 세팅을 그대로 사용한다.
Xcode Project 의 의미
모든 파일, 리소스를 빌드하는데 필요한 정보의 저장소이며, 항상 빌드하는 방법을 명시하는 target 을 하나 이상 포함한다.
Project가 가지고 있는 정보
- 모든 소스파일에 대한 참조 (swift 파일, 외부 라이브러리) -> pbxproj 파일
- Structure Navigator 에서 소스파일을 그룹화함
- Debug 혹은 Release Build configuration
- 모든 타겟에 대한 build setting 을 지정한다 (위에서 보았듯이!) -> 하위 Target 에 대한 빌드 세팅이 재정의되지 않으면, Project 빌드 세팅을 사용하게 된다.
Build Setting
Build setting 의 정보들은, 컴파일 시 Xcode 가 swift 컴파일러에게 전달한다. 또한 위에서 설명했듯이, Project 단위로 빌드 세팅을 지정하거나, 타겟 단위로 지정할 수 있다!
Xcode workspace
- Project(소스파일, 라이브러리, Build configuration) 과 기타 리소스를 그룹화하여 함께 작업할 수 있는 문서
- 다수의 Project 를 사용하고 싶은 경우, workspace 하위로 관리 -> 즉 하나의 workspace는 여러 개의 Xcode project 를 포함할 수 있다. (중요!)
- Xcode가 자동으로 workspace 안에 있는 프로젝트들간의 관계를 설정해준다. 그리고 작업 범위를 확장시켜준다. 예를들어 A Project 에서 B Project 의 프레임워크를 사용하는 경우, A Project 의 refactor 작업이 B Project 의 프레임워크까지 영향을 미친다.
- 또한 빌드시에, 한 프로젝트가 같은 workspace 내부에 있는 다른 프로젝트의 product, 즉 타겟을 사용할 수 있다.
- 기본적으로, Workspace 안에 있는 모든 프로젝트는 같은 빌드 경로를 공유한다. (workspace build directory)
- workspace 내부의 각 프로젝트들은 모든 파일을 공유하기 때문에, 만약 똑같은 Library 를 쓴다면 모든 프로젝트에 추가할 필요가 없다. 하나의 프로젝트만 사용한다면, Xcode가 자동으로 빌드 순서를 조정해준다.
중요
- 한 프로젝트는 여러 workspace 에 포함될 수 있다. 따라서 만약 A프로젝트만 작업하고 싶으면, A프로젝트만 포함된 workspace 를 열거나, 다른 workspace 에 A 프로젝트를 추가할 수 있다.
Xcode Scheme
Xcode scheme은 빌드할 Target 의 조합을 결정한다.
- Scheme 은 원하는 만큼 생성할 수 있지만, 동시에 하나의 scheme만 활성화된다. 그리고 scheme 을 선택하면 해당 scheme 을 사용해서 빌드할 프로덕트가 어떤 하드웨어에 빌드될지도 정해야 한다 (run destination)
- 위 스크린샷을 보면, Target을 선택할 수 있고, 또한 타겟들을 어떤 순서로 Build 할 지도 정할 수 있다.
- Dependency order 는 Xcode 가 판단하는 대로 각 target 들을 Build하고, Maual Order 는 개발자가 지정할 수 있지만 별로 사용할 일이 없어보임!
- 또한 Scheme 마다, Build configuration을 가질 수 있는데, 다양한 빌드 설정을 생성하고 (테스트라던가, 디버그 용) 해당 설정들을 사용하는 Scheme 들을 생성해 다양한 개발 환경을 세팅할 수 있을 것으로 보인다.
References
https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Targets.html