EEYatHo 앱 깎는 이야기

Swift ) XcodeGen - EEYatHo iOS 본문

iOS, Swift

Swift ) XcodeGen - EEYatHo iOS

EEYatHo 2021. 4. 20. 21:12
반응형

 

0. 배경 설명


Xcode 는, 프로젝트가 로드해야하는 소스파일을 찾기 위한 값인 fileRef 를
.xcodeproj/project.pbxproj 에 기록합니다.

  • fileRef는 New file 로 소스파일을 추가할 때 Xcode 에서 내부적으로 생성합니다. 

.xcodeproj/project.pbxproj에 소스파일들의 fileRef가 저장된 모습

 

때문에 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

 

yonaskolb/XcodeGen

A Swift command line tool for generating your Xcode project - yonaskolb/XcodeGen

github.com

 

 

 

 

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

 

.xcconfig 파일

 

..pbxproj 파일 ( .xcodeproj 패키지 안에 존재 )

 

project.yml 에 적용한 모습

 

 

 

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

 

yonaskolb/XcodeGen

A Swift command line tool for generating your Xcode project - yonaskolb/XcodeGen

github.com

 

 

 

 

이외에도 더 다양한 프로젝트 스펙들은 github에 나와있습니다.

https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md

 

yonaskolb/XcodeGen

A Swift command line tool for generating your Xcode project - yonaskolb/XcodeGen

github.com

 

 

 

 

 

 

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 파싱 오류가 납니다.


 

project.yml파일
xcodegen generate 커맨드 입력 -> 오류 발생

해결방법은 쌍따움표(")로 감싸주면 됩니다.

project.yml파일

 

 

 

 

4 - 4. xcconfig


Xcode 프로젝트의 설정값들을 추출한 파일입니다.

프로젝트에서 .xcconfig을 추출하기 위해서는,

아래 링크의 프로젝트를 실행하고,

https://github.com/dempseyatgithub/BuildSettingExtractor

 

dempseyatgithub/BuildSettingExtractor

Extracts the build settings of an Xcode project into xcconfig build configuration files. - dempseyatgithub/BuildSettingExtractor

github.com

 

프로젝트 파일을 드로그 앤 드랍하는 것만으로 ,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에서 어떻게 설정하는지 알 수 있었습니다.

 

Comments