XcodeGenのちょっとしたTips


XcodeGenの地味なTipsについてまとめました。

XcodeGenのBuild Configurationsの階層について

XcodeGenのビルド設定は以下の階層になっています。これを最初に知っておくとスムーズです。
公式ドキュメントの目次の構成がproject.ymlの構成のそれなので、そのまま参考にすると良いかと思います。

# Project全体の設定
settings:
  # Projectの全Build Configurationsに反映される設定
  base:
  # Projectの各Build Configurationごとの設定
  configs:
    Debug:
<中略>
# Targetごとの設定
targets:
 {Target名}:
    # Targetの全Build Configurationsに反映される設定
    base:
    # Targetの各Build Configurationごとの設定
    configs:
      Debug:

cacheを利用する

xcodegen --use-cacheでXcodeGenのキャッシュが効くようになります。

キャッシュファイルは --cache-path のオプションで指定しない限り、~/.xcodegen/cache/{xcodeprojファイルのpathのMD5ハッシュ値}に保存されます。

  • ファイル構成(追加・削除)
  • project.yml

に変更がない場合、キャッシュが効きます。
実際は、一時的に生成したcacheファイルと実在するキャッシュを比較して差分がなければ何もしない処理になってます。

キャッシュの判定処理はここ

project生成後に何かしらのコマンドを実行する

postGenCommandのオプションで指定ができます。(例えばpod installなど)
これと上記のキャッシュを利用すると、ローカルのproject構成に変更がない場合、xcodegenコマンドも実行されないし、合わせてpod installも実行されないので省エネです。
例えばgit checkoutを頻繁に繰り返す時など地味にこの設定が効くと思います。

※公式でもオススメされてます (https://github.com/yonaskolb/XcodeGen/blob/master/Docs/FAQ.md#can-i-use-cocoapods)

options:
  postGenCommand: pod install

一部の値だけBuildConfig間で共有する

単純にprojectファイルを編集する場合だと複数のターゲットでコピペが発生してしまうところを、Setting GroupsTarget Templateなど使って、共通化できる点もXcodeGenの魅力かと思います。

それ以外にもyamlの記法を使って一部のパラメータだけ共有するようなこともできます。
例えばyamlのアンカー記法を使うと変数を参照するような書き方もできます。

ATarget:
  CURRENT_PROJECT_VERSION: &a_build_number 1
  <中略>
BTarget:
   CURRENT_PROJECT_VERSION: *a_build_number

他にも何かあれば追記します。