XCodeGen対応のTIPS

はじめに
こんにちは。iOSエンジニアの@satoshi-babaです。 いま巷で賑わっているXCodeGenを検証する過程で、ハマりどころがいっぱいあったので簡単なTIPSを共有したいと思います。 そもそもXCodeGenがどんなものかというのは割愛させていただきます。
バイトルはなぜXCodeGen対応したの?
バイトルiOSは10名前後のエンジニアが開発に携わっています。 ABテストの実施もよく行っており、ファイルの追加/削除が頻繁に行われるようになっています。
元々、開発フローの課題の1つにxcodeprojのコンフリクト抑止がありました。 その中で年末に行われていたtry! Swift Tokyo 2020 Meetup!!に参加した時に、XCodeGenの紹介があり「これだ!」と思い導入することにしました。
TIPS
Templateバリ便利!
SchemeとTargetにそれぞれTemplateを用意することができます。
例えばTargetであればこんな感じにテンプレートを用意することで記載をかなり簡略がすることができます。 例えば複数の環境設定がされている場合に使えます。
targetTemplates:
application-base:
type: application
platform: iOS
sources:
- path: xxxxx
info:
properties:
UISupportedInterfaceOrientations: \[UIInterfaceOrientationPortrait\]
UILaunchStoryboardName: LaunchScreen
settings:
base:
TARGETED\_DEVICE\_FAMILY: 1
CODE\_SIGN\_STYLE: Manual
ENABLE\_BITCODE: No
GCC\_C\_LANGUAGE\_STANDARD: gnu99
CLANG\_CXX\_LANGUAGE\_STANDARD: gnu++0x
CLANG\_ANALYZER\_LOCALIZABILITY\_NONLOCALIZED: Yes
dependencies:
- sdk: SystemConfiguration.framework
- sdk: libsqlite3.tbd
preBuildScripts:
- name: R.Swift
script: |
echo 'make R.generated.swift'
if \[ -e "$SRCROOT/xxxxx/xxxxx/R.generated.swift" \]; then
echo 'remove R.generated.swift'
rm "$SRCROOT/xxxxx/xxxxx/R.generated.swift"
fi
"$PODS\_ROOT/R.swift/rswift" generate "$SRCROOT/xxxxx/xxxxx/R.generated.swift"
inputFiles:
- $TEMP\_DIR/rswift-lastrun
outputFiles:
- $SRCROOT/xxxxx/xxxxx/R.generated.swift
targets:
# 個別の微小な設定を書くだけだから楽できる。
stage1:
templates:
- application-base
info:
path: $(SRCROOT)/xxxxx/xxxxx/stage1/Info.plist
stage2:
templates:
- application-base
info:
path: $(SRCROOT)/xxxxx/xxxxx/stage2/Info.plist
R.generated.swiftが解決できない時の対処
Gitからcloneした直後にxcodegenしてビルドすると以下のエラーが発生します。
``
R.swiftを導入したことがある方なら気づいていると思いますが、Run ScriptでR.generated.swiftを作成した後に手動で追加する手順があります。 そうするとxcodegenでプロジェクトファイルを生成する時には、上記のファイルはないわけなので参照に含まれなくなります。
そんな時はsourcesの設定でファイルがないときでも参照を追加するようにしましょう!
sources:
- path: xxxxx
- path: xxxxx/xxxxx/R.generated.swift
optional: true
createIntermediateGroups: true
Build Settingsのキー名の探し方
Build Settingsで細かい設定がされている場合、XCodeGenのsettingsで設定する必要があります。 バイトルの場合はC++ Language Dialectが該当していて設定する必要がありました。
こんな感じに設定します。
settings:
base:
CLANG\_CXX\_LANGUAGE\_STANDARD: gnu++0x
この設定のキー名はCode Sign Styleなんかはなんとなく勘で行けることもありますが、 物によっては全くわからない場合があります。
そんな時はXCodeのプロジェクト設定から探すことができます。(Appleにドキュメントがあると思いますが探してません) 画像のQuick HelpのDeclarationを参照すれば一発ですね!これで大概のことはできそうです!

Build Settingsの設定値の探し方
Build Settingsのキーはわかっても具体的な設定がわからないことがあります。 例えばバイトルでハマったのは、C++ Language Dialectの設定値がわかりませんでした。
設定値は具体的な何を設定する項目なのかがわかれば、各種ドキュメントから漁ることで解決できます。 C++ Language DialectはClangの設定項目なので、 このページを参照することで解決することができました。
まとめ
XCodeGenのハマりどころは多いですがキチンと対処がわかっていれば怖くありません。 バイトルも取り入れられるところはどんどんモダンな技術を取り入れていきたいと思います。
Discussion