일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- view
- IOS
- Swift
- MacOS
- error
- Code
- 한글
- Python
- github
- 개발자
- UIButton
- Notification
- Git
- window
- Archive
- mac
- 웹뷰
- Session
- iOS16
- Xcode
- FLUTTER
- appstore
- rxswift
- JPA
- Apple
- Realm
- darkmode
- Firebase
- stack
- SwiftUI
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) XcodeGen - EEYatHo iOS 본문
0. 배경 설명
Xcode 는, 프로젝트가 로드해야하는 소스파일을 찾기 위한 값인 fileRef 를
.xcodeproj/project.pbxproj 에 기록합니다.
- fileRef는 New file 로 소스파일을 추가할 때 Xcode 에서 내부적으로 생성합니다.
때문에 git을 이용한 협업시, 한 프로젝트에 새로운 파일을 각각 생성한 뒤 merge할 때,
.xcodeproj/project.pbxproj에 conflict가 발생하게 됩니다.
이런 문제점을 해결하고자,
프로젝트에서 로드하는 소스파일을, 프로젝트 내부의 디렉토리 구조 기반으로 찾을 수 있게 합니다.
때문에 서로 다른 파일을 만든 뒤 merge 해도,
디렉토리 안에 있는 소스파일을 로드하도록. xcodegen 명령어만 실행하면
xcodeproj 파일이 새로 만들어지며 ( = xcode generater ). conflict 가 해결 됩니다.
더불어, 프로젝트의 여러 설정들 ( 최소 iOS버전, 빌드 옵션 등 ) 도 xcodeproj 파일에 종속되어 있는데,
이 설정들을 텍스트 파일로 명세하여, xcodeproj 를 새로 만들 때 넣어줄 수 있습니다.
즉, 프로젝트 설정들을 텍스트 파일로 관리할 수 있습니다.
1. XcodeGen 설치방법
Homebrew 사용시 간단하게 install 할 수 있으며,
brew install xcodegen
Mint, Make, SPM 등 다양한 설치방법은 github에 나와있습니다.
https://github.com/yonaskolb/XcodeGen
2. XcodeGen 사용방법
XcodeGen은 소스파일의 위치를 표시한 설정파일과 실제 디렉토리 구조를 사용하여 .xcodeproj을 생성합니다.
해당 설정파일은 project.yml이며, .xcodeproj 파일에 종속된 다양한 빌드 속성들을 설정할 수 있습니다.
기본적인 project.yml 명세입니다.
주석을 참고해주세요.
name: # 프로젝트 이름
options:
postGenCommand: # 프로젝트 파일 생성 후 실행할 커맨드 (일반적으로 pod install)
targets:
[타겟이름]:
setting:
base: # Debug, Release 빌드 공통 세팅값들
configs:
Debug: # Debug 빌드에서의 세팅값들
Release: # Release 빌드에서의 세팅값들
type: # 타겟의 타입 (일반적인 앱: application, 앱 확장 : app-extension 등등)
platform: # 타겟의 플랫폼 (iOS, macOS, watchOS 등)
deploymentTarget: # 최소 개발타겟 버전 (11.0, 13.0 등)
sources: # 소스파일의 Root 디렉토리들
dependencies: # pod을 제외한 3가지 방법(carthage, SPM, 직접 삽입하기)을 사용할 때 의존성을 명세하는 부분
[타겟이름2]:
...
project.yml 파일을 잘 만든 후 ,
xcodegen generate
해당 커맨드를 실행하면 .xcodeproj 파일이 만들어지며 디렉토리 구조를 기반으로 생성하기 때문에,
서로 다른 파일을 생성한 branch를 merge해도 conflict가 발생하지 않습니다.
2 - 1. setting
setting 항목은 Build Settings 값들을 설정할 수 있는 부분으로,
.xcconfig 파일이나 .pbxproj 파일을 통해,
Xcode 에 있는 설정이, 텍스트로 쓸 때 어떻게 써야하는지 직관적으로 파악할 수 있습니다.
자세한 설명은 github 에 있습니다.
.pbxproj 파일은 xcodeproj 패키지 안에 존재하며,
.xcconfig 파일은 오픈소스로 추출할 수 있습니다.
.xcconfig 파일 추출 오픈소스 : https://github.com/dempseyatgithub/BuildSettingExtractor
2 - 2. sources
소스파일의 Root 디렉토리들을 적는 부분으로, 배열 형태로 간단히 적을 수도 있으며,
sources: [HsmoaDevapp-Info.plist, Hsmoa]
어떤 디렉토리에서 어떤 파일은 안읽는 식의 상세한 설정도 가능합니다.
sources:
- HsmoaDevapp-Info.plist
- path: Hsmoa
excludes: ["보조파일/Info.plist"] # Hsmoa의 하위 디렉토리 중에서, "보조파일/Info.plist"는 읽지 않는다
2 - 3. dependencies
cocoapod 이 아닌 다른 방법들(SPM, carthage, 직접 삽입 등)을 사용하여 외부 프레임워크를 적용할 때 의존성을 명세하는 부분으로,
( cocoapod 은, xcodegen 이후 pod install 해줘야 합니다. )
아래는 직접 삽입하는 방법의 예시입니다.
- dependencies:
- framework: AudioToolbox.framework # 프레임워크 경로
embed: false # embed 여부
- framework: KakaoPlusFriend.framework
embed: false
- sdk: libiconv.2.4.0.tbd
링크에 dependency에 대한 다양한 옵션 설명이 나와있습니다.
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#dependency
이외에도 더 다양한 프로젝트 스펙들은 github에 나와있습니다.
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md
3. XcodeGen을 도입하면서 겪은 문제나 팁 정리
3 - 1. AudioToolbox, CoreGraphics 등 Xcode에서 내장으로 지원해주는 프레임워크를 dependencies 항목에 넣을 때.
- framework: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioToolbox.framework
이렇게 풀 경로로 넣으면,
Swift가 아닌 ObjectiveC의 객체들을 가져오는..? 것을 볼 수 있으며,
ObjectiveC 객체를 사용하여 동작하게 소스를 고친다고 해도,
Clang 관련 수백개의 오류들을 볼 수 있습니다.
해결법은 그냥 프레임워크 명만 써주시면 됩니다.
- framework: AudioToolbox.framework
4 - 2. dependencies 항목에서 프레임워크 파일을 찾는 경로는 Build Settings의 Search Paths - Framework Search Paths 기반입니다.
즉 위 사진에서, 프레임워크 파일을 직접 관리 경우, 프레임워크 파일들이
$(PROJECT_DIR) 에 있어도 되고,
$(PROJECT_DIR)/Hsmoa/유틸리티/External 에 있어도 됩니다.
4 - 3. settings 항목의 CODE_SIGN_IDENTITY는 콜론(:)이 포함되어 있어서 그냥 쓰면 xcodegen 파싱 오류가 납니다.
해결방법은 쌍따움표(")로 감싸주면 됩니다.
4 - 4. xcconfig
Xcode 프로젝트의 설정값들을 추출한 파일입니다.
프로젝트에서 .xcconfig을 추출하기 위해서는,
아래 링크의 프로젝트를 실행하고,
https://github.com/dempseyatgithub/BuildSettingExtractor
프로젝트 파일을 드로그 앤 드랍하는 것만으로 ,xcconfig파일을 추출할 수 있으며
[타겟이름]-Debug.xcconfig 파일의 내용은 project.yml의 settings-configs-Debug 항목에,
[타겟이름]-Release.xcconfig 파일의 내용은 project.yml의 settings-configs-Release 항목에,
[타겟이름]-Shared.xcconfig 파일의 내용은 project.yml의 settings-base 항목에 적어주시면
완벽하게 똑같은 build settings를 가진 프로젝트 파일을 생성할 수 있습니다.
4 - 5. defaultConfigurationName
CI/CD를 하는 과정에서,
Project -> Info -> defaultConfigurationName 같은 설정은 xcconfig로 알 수 가 없고,
XcodeGen Github에서 어떻게 설정하는지 알 수 있었습니다.
'iOS, Swift' 카테고리의 다른 글
Swift ) 디버그가 안될 때, breakpoint not working - EEYatHo iOS (0) | 2021.04.26 |
---|---|
Swift ) Xcode Build Setting의 inherited - EEYatHo iOS (0) | 2021.04.26 |
Swift ) Mail 앱으로 메일 보내기(MessageUI) - EEYatHo iOS (0) | 2021.04.08 |
Swift ) Archive 없이 Organizer창 열기 - EEYatHo iOS (0) | 2021.04.08 |
Swift ) IDFV - EEYatHo iOS (0) | 2021.04.08 |