XcodeGenでCarthageやCocoaPods環境のXcodeプロジェクトを生成する
Table of Contents
Xcodeプロジェクト(.xcodeproj)のコンフリクトはストレスです。
この記事ではXcodeGenを使ってCarthageやCocoaPodsによるライブラリ管理されたXcodeプロジェクトを生成する方法を説明します。
もしXcodeGenの特徴やメリットを把握していない場合は、「XcodeGenを基本から理解する
」に詳細をまとめてあります。
また基本的な使い方について理解したい場合は「XcodeGenで最低限のXcodeプロジェクトを生成する
」に詳細をまとめてあります。
もしCarthageについて分からない部分があれば、「Carthageの使い方を体系的に理解する
」に詳細をまとめてあります。
XcodeGenで通常のiOSプロジェクトを用意する
name: iOSWithCarthageProj
options:
bundleIdPrefix: com.mothule
targets:
iOSWithCarthageProj:
type: application
platform: iOS
sources: iOSWithCarthageProj
iOSWithUTProjTests:
type: bundle.unit-test
platform: iOS
sources: iOSWithCarthageProjTests
dependencies:
- target: iOSWithCarthageProj
sourcesのiOSWithCarthageProjとiOSWithCarthageProjTestsはターゲット追加時にXcodeによって自動生成されるファイル群です。
このyamlをproject.ymlとして保存してxcodegen generateコマンドを実行するとUnitTest付きのiOSアプリのXcodeプロジェクトが生成されます。
プロジェクトにCarthage管理のライブラリを追加する
例えばCarthageでAlamofireとAlamofireImageをビルドして、それらをプロダクトターゲットに追加する場合は次のように書きます。
iOSWithCarthageProj:
# ~ 略 ~
dependencies:
- carthage: Alamofire
- carthage: AlamofireImage
これらを追記して実行すると、フレームワークのリンクとビルドフェイズにcarthage copy-frameworksのスクリプトフェイズを自動生成してくれます。
これは便利ですね。Carthageの面倒な点をキレイにカバーできています。
注意事項
XcodeGenはあくまでもXcodeプロジェクトをプロジェクト仕様に基づいて生成するだけです。
そのためCarthageによるフレームワークビルド自体は、事前に行っておく必要があります。
Carthageでフレームワークビルドをせず先にxcodegen generateを実行すると次のように形はあるけど存在しないリンク情報がセットされてしまいます。
CartfileやフレームワークビルドはXcodeGenの責任範囲外なので自分で用意します。
Carthageの実行パスを変更する
Carthageにパスが通っていれば特に問題は起きません。 しかし、MintでCarthageを管理している場合、実行パスを指定する必要があります。
options:
carthageExecutablePath: mint run Carthage/Carthage
Carthageのビルド結果のパスを変更する
デフォルトではCarthage/Buildです。
もしこれを別のパスに変更したい場合は、options.carthageBuildPathで指定します。
options:
carthageBuildPath: ../../Carthage/Build # 例
プロジェクトにCocoaPods管理のライブラリを追加する
XcodeGenで管理されたXcodeプロジェクトにCocoaPods管理のライブラリを追加する場合について説明します。
実は非常に単純です。
というのもXcodeGenはワークスペースではなくプロジェクトを生成しているだけなので、
プロジェクト仕様ファイルでPodfileなどを参照する必要ありません。
XcodeGenでプロジェクト生成後に、pod installを実行するだけです。
そして実はプロジェクト仕様ファイルには、生成コマンド実行後フックが用意されているのでプロジェクト仕様ファイル内でpod installを呼び出すことを設定できます。
options:
postGenCommand: pod install
このオプションを追加することでxcodegen generateを実行するとそのままpod installも実行されます。
疑問点
公式では--use-cacheとpostGenCommandオプションを組み合わせを推奨しています。
しかし、Podfileを変更してxcodegen generateを実行してもスキップされてしまいます。
Podfileだけの更新であればpod installを実行すれば良いという話ではありますが…
findCarthageFrameworksというオプション
CarthageのオプションにfindCarthageFrameworksというものがあります。
これは例えばReactiveMapKitを使う場合通常であれば依存してるフレームワーク全部を記載します。
targets:
App:
dependencies:
- carthage: ReactiveCocoa
- carthage: ReactiveMapKit
しかしfindCarthageFrameworksオプションを使うことでReactiveCocoaの時点でReactiveMapKitも一緒に依存解決してくれるオプションです。
options:
findCarthageFrameworks: true
targets:
App:
dependencies:
- carthage: ReactiveCocoa # ReactiveMapKitも見つける
- carthage: OtherCarthageDependency
findFrameworks: false # 個別にグローバルオプションを無効化することもできる
XcodeGenでBuild Configurationの設定をする
XcodeGenを使って、Carthage+CocoaPods+UnitTestのXcodeプロジェクトを生成することができました。 次はDebugやReleaseなどBuild Configurationの設定を「XcodeGenでBuild ConfigurationとSchemeの設定をする 」で説明します。
