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の設定をする 」で説明します。