XcodeGenでCarthageやCocoaPods環境のXcodeプロジェクトを生成する

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のiOSWithCarthageProjiOSWithCarthageProjTestsはターゲット追加時にXcodeによって自動生成されるファイル群です。
このyamlをproject.ymlとして保存してxcodegen generateコマンドを実行するとUnitTest付きのiOSアプリのXcodeプロジェクトが生成されます。

プロジェクトにCarthage管理のライブラリを追加する

例えばCarthageでAlamofireAlamofireImageをビルドして、それらをプロダクトターゲットに追加する場合は次のように書きます。

iOSWithCarthageProj:
  # ~ 略 ~
  dependencies:
    - carthage: Alamofire
    - carthage: AlamofireImage

これらを追記して実行すると、フレームワークのリンクとビルドフェイズにcarthage copy-frameworksのスクリプトフェイズを自動生成してくれます。
これは便利ですね。Carthageの面倒な点をキレイにカバーできています。

注意事項

XcodeGenはあくまでもXcodeプロジェクトをプロジェクト仕様に基づいて生成するだけです。
そのためCarthageによるフレームワークビルド自体は、事前に行っておく必要があります。
Carthageでフレームワークビルドをせず先にxcodegen generateを実行すると次のように形はあるけど存在しないリンク情報がセットされてしまいます。

MissedFrameworks

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-cachepostGenCommandオプションを組み合わせを推奨しています。 しかし、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の設定をする 」で説明します。

このエントリーをはてなブックマークに追加