-
XcodeGen을 활용해 xcodeproj의 마지 컨플릭트에서 벗어나라iOS 2020. 4. 26. 15:35반응형
XcodeGen 은 폴더 구조와 설정 파일 하나를 바탕으로 Xcode Project 를 만드는 툴입니다.xcode로 개발할 때 가장 골치가 아픈 것은 xcodeproj 이었습니다.
뭐만 하면 마지 컨플릭트가 나고, 뭐만 하면 마지 컴플릭트가 나고..
이게 단독개발이면 그나마 참을만한데,
여럿이서 피처 개발을 하면 마지 컴플릭트를 해결하는 것 자체가 귀찮습니다.
다른 데에서는.. XcodeGen 을 사용해서 이런 문제를 해결한다는 말을 들은 적이 있었습니다.
Let's Swift 에서 데브소울님의 컨퍼런스에서도... XcodeGen 을 이용해 마지 컴플릭트를 해결한더라- 라는 말이 있었습니다.
그래서 XcodeGen을 한번 써보자 해서 다운받아서 쓰게 되었습니다.
https://github.com/yonaskolb/XcodeGen
설치
여러 방법이 있지만 저는 Homebrew 로 설치했습니다.
brew install xcodegen
연동
iOS 프로젝트 폴더에 project.yml 을 만들어서, 그곳에 이것저것 프로젝트 설정을 입력해줍니다.
그리고
xcodegen generate
을 실행시키면, 자동으로 xcodeproj 파일을 만들어 줍니다.
project.yml 파일을 xcodeproj 로 자동으로 만들어 준다면..
기존의 xcodeproj 파일을 자동으로 yml 로 만들어주지 않을까 해서 도큐먼트를 쭉 살펴봤습니다.
그런 기능은 없었고 무조건 수동으로 설정해 주어야 합니다.
쩝.
저의 경우, 예전에 만들어뒀던 프로젝트 하나를 XcodeGen 과 연동해보려고 합니다.
모든 라이브러리가 SPM 으로 연동되어있는 프로젝트입니다.
이곳에 project.yml 을 만들었습니다.
name: DemoApp targets: DemoApp: settings: base: INFOPLIST_FILE: memo/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.myapp type: application platform: iOS deploymentTarget: 13.0 sources: [memo]
하나씩 설명하겠습니다.
name: 생성되는 xcodeproj 파일 이름입니다. 여기선 DemoApp.xcodeproj 가 생성됩니다.
targets: 빌드할 타겟들을 나열합니다.
setting 의 base : 주요한 설정을 입력합니다.
INFOPLIST_FILE: info.plist 파일 경로명입니다.
PRODUCT_BUNDLE_IDENTIFIER : 번들 아이덴티파이어입니다.
type: 프로덕트 타입입니다. 저희는 앱을 만드므로, application 을 입력했습니다.
playform: 맥인지 아이폰인지, 아이패드인지 등을 입력합니다.
deploymentTarget : 타겟의 deployment Target 입니다.
sources: 컴파일할 swift 파일, 에셋 파일, lproj 파일들을 넣어두었던 경로입니다.
이제 빌드하고 실행시켜 보았습니다.
산뜻하게 잘 되었습니다. 열어서 확인해봅니다.
썩 나쁘지 않은 출발입니다.
빌드해볼까요?
외부 라이브러리가 연결되어, 오류가 났습니다.
SPM 디펜던시 추가
원래 본을 뜨려고 했던 오리지널 프로젝트를 들어가봅시다.
이것저것 설치해 놨었네요. 타겟도 살펴봅시다.
뭐, 비슷합니다.
SPM 의 메이저 버전을 모두 베껴서, 다음과 같이 설정파일을 수정하고 재빌드해 보겠습니다.
name: DemoApp packages: RxSwift: url: https://github.com/ReactiveX/RxSwift from: 5.0.1 RxCocoa: url: https://github.com/ReactiveX/RxSwift from: 5.0.1 SnapKit: url: https://github.com/SnapKit/SnapKit from: 5.0.1 RxBiBinding: url: https://github.com/RxSwiftCommunity/RxBiBinding from: 0.2.5 CombineDataSources: url: https://github.com/CombineCommunity/CombineDataSources from: 0.2.4 RxKeyboard: url: https://github.com/RxSwiftCommunity/RxKeyboard from: 1.0.0 RxViewController: url: https://github.com/devxoul/RxViewController from: 1.0.0 RxExpect: url: https://github.com/devxoul/RxExpect from: 2.0.0 targets: DemoApp: settings: base: INFOPLIST_FILE: memo/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.myapp type: application platform: iOS deploymentTarget: 13.0 sources: [memo] dependencies: - package: RxSwift - package: RxCocoa - package: SnapKit - package: RxBiBinding - package: CombineDataSources - package: RxKeyboard - package: RxViewController
새로 번잡스러운 것들이 많이 생겼습니다.
packages : 받아올 SPM들의 url 과 버전을 나열하는 목록들입니다.
패키지 이름, url, 메이저 버전을 같이 입력합니다.
RxSwift:
url: https://github.com/ReactiveX/RxSwift
from: 5.0.1
RxCocoa:
url: https://github.com/ReactiveX/RxSwift
from: 5.0.1
이게 특이할 겁니다.
RxSwift 는 RxCocoa 와 세트기 때문에, 이렇게 엮어서 표현합니다.
dependencies : 타겟에 인클루드할 라이브러리들을 나열합니다.
아까 살펴본 타겟을 참고하여 전부 베껴 적었습니다.
결과입니다.
다시 켜보니 SPM 라이브러리가 잘 포함되었습니다.
빌드도 잘 됩니다.
폴더 구조
원래 프로젝트는, 이렇게 Group Without Folder 로 잘 정렬되어 있었습니다.
지금 프로젝트는, 폴더 구조 없이 중구난방입니다.
처음에는 완전히 100 % 일치했던 것을 목표로 했기 때문에,
저것처럼 폴더 없는 그룹을 만들려고 시도했습니다.
삽질해본 결과, 지금은 지원하지 않는 것 같습니다.
다른 블로그 글을 살펴봐도 그렇습니다.
https://techlife.cookpad.com/entry/2019/04/26/110000
일본어지만 대충 번역기 돌려서 살펴봤습니다.
파일 폴더 트리가 강제된다고 적혀 있습니다.
이 말인 즉슨 뻘짓하면서 실제 파일 트리와 빌드 트리가 불일치하게, [Group Without Folder] 을 써서 사람 헷갈리게 하지 말고,
아예 그냥 폴더를 용도별로 나누는 방법밖에 없어 보입니다.
파인더를 켜서 용도별로 새 폴더를 만들어서 분리해 주었습니다.
폴더별로 나누는 게 마치 안드로이드 개발하는 것 같습니다.
재빌드해 보겠습니다.
파일 구조를 감지해서 xcodeproj 를 재생성해 주었습니다.
직접 소규모 프로젝트를 연동하면서 느낀 점을 정리해 보겠습니다.
장점
- 마지 컨플릭트를 해결할 수 있는 게 가장 강력한 기능입니다. 이 오픈소스를 이용하는 가장 주요한 이유겠지요.
- 카르타고를 연동하지는 않았지만, 카르타고를 연동할 때 번잡스럽게 프레임워크 연결하고 이런 것도 다 알아서 해준다고 합니다.
- 폴더 트리 구조와 xcode 의 파일 계층이 정확히 1:1 대응되게 빌드됩니다. 파인더로 정리할 수도 있고, 굳이 yml 파일에서 폴더 계층을 명시해줄 필요도 없습니다. 컴파일할 최상위 폴더만 명시하면 알아서 잘 빌드해 줍니다.
단점
- 레퍼런스가 부족합니다. 한글로 된 블로그 소개글은 아예 없고, 영어나 일어 블로그 글 몇개 정도만 보입니다.
- 기존에 존재하는 xcodeproj을 project.yml로 만드는 방법이 아예 없습니다. 수동으로 설정해 주어야 하는데...
큰 프로젝트에서는 컴파일 옵션, 브릿징 헤더, Capablities 등이 엄청 많을텐데... 그걸 눈으로 일일히 파악해서 yml 파일로 옮겨준다는 것은, 상당히 피곤한 작업이 될 것 같습니다.- 공식 문서의 명세가 많이 불친절합니다.
상세 설정
그 외의 세부적인 설정은 공식 문서를 참고하시길 바랍니다.
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md
레퍼런스
https://techlife.cookpad.com/entry/2019/04/26/110000
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/Examples.md
https://number42.de/blog/2018/07/24/xcodegen-article.html
https://qiita.com/messyu4/items/870011ebbc7ce47b786d
반응형'iOS' 카테고리의 다른 글
Fastlane 으로 Firebase Distribution 연동하기 (0) 2020.08.06 FastLane Match 를 이용해 사이닝 관리하기 (0) 2020.08.06 애드훅보다 간편하다! 테스트플라이트보다 빠르다! 파이어베이스 iOS 배포를 활용해 보자 (4) 2020.04.26 Xcode 11 에서 애드훅으로 앱을 배포하는 방법, 드롭박스나 구글 클라우드 이용보다 확실한 배포 방법 (1) 2020.04.26 [잡설] 빌드 속도 단축에 대한 고민 (0) 2020.04.25