![見出し画像](https://assets.st-note.com/production/uploads/images/30922934/rectangle_large_type_2_f34868321d908295e320574bc37e219a.jpg?width=1200)
note iOSアプリの開発環境にXcodeGenを導入した
突然iOSメンバーが1人から3人になったのでプロジェクトファイルのコンフリクト問題が目立つようになりました。メンバーが増えた話はラジオでもわいわい喋ってます。
ある程度の開発スピードを維持するためにはこういったコンフリクトなどの問題は少しでも取り外していきたいので、まずはお試しとして個人アプリにXcodeGenを導入してみました。しかし、1人開発だとコンフリクトすることもないのであまりメリットを感じず...やはり会社のアプリで試してみることにしました。
XcodeGenとは
project.ymlというYAMLファイルから*.xcodeprojファイルを自動的に生成してくれるCLIツールです。Swift製のOSSで、日本人のコントリビューターも複数いるので、何か困ったことがあっても問題解決がしやすいことも導入の障壁を下げてくれます。
導入
インストールについてはMintfileを作成してMint経由で行うようにしました。
yonaskolb/xcodegen@2.16.0
あとはproject.ymlを作成してmint run xcodegen generateを叩くと*.xcodeprojファイルが生成されます。ただ、このproject.ymlの微調整が大変でした。ベースは先人の知恵が色々あるのですが、最も偉大な貢献をしてくれたのは@d_dateさんのこちらのGistです。最初にこちらの内容を持ってきて自社独自にカスタマイズしていくことで少しずつ動くようになりました。感謝しかないです🙏🏻(普段d_dateと認識していたのでGitHubのアカウント名がd-dateだったことに少し混乱が発生しました)ある程度調整が終わるとGitから*.xcodeprojを削除すればタスクは完了です。
ハマったところ
それでもハマったところがいくつかありました。noteはまだまだObjective-Cとの連携部分が多いのでブリッジなどの対応が必要でした。これらはSWIFT_OBJC_BRIDGING_HEADERで*-Bridging-Header.hを設定したり、GCC_PREFIX_HEADERで*-Prefix.pchを設定したり、SWIFT_OBJC_INTERFACE_HEADER_NAMEで*-Swift.hを設定することで回避可能でした。また、これらの項目はXcodeのBuild Settingsの画面でEditor->Show Setting Namesを選択すれば表示されます。設定したい項目を選択して⌘+Cなどでコピーすれば項目名や値がクリップボードにコピーされるので便利でした。
また、XcodeGenはフォルダ階層からプロジェクトを生成するので、既にプロジェクトからは消えていたけどファイルとしては存在していた物が突然現れたりすることがあり混乱しました。ファイルの移動に失敗したりしている場合などは同じファイル名の物が存在することもあってどちらが正解なのか確認していく作業も大変でした。
Tips
noteのiOSアプリではライブラリの管理にCocoaPodsとSwift Package Managerを利用しているのですが、XcodeGenでプロジェクトを生成したらpod installを叩く必要があります。これも毎回実施するのも面倒なのでMakefileに一気に実行する処理を書きました。
generate:
mint run xcodegen generate
bundle exec pod install
あとは.git/hooks/post-checkoutに下記のような設定をしておくことで常に最新の状態で生成できるようにしてあります。(実行に少し時間はかかります)
#!/bin/sh
CURRENT_BRANCH=`git symbolic-ref --short HEAD`
git fetch -p
exists=`git show-ref remotes/origin/$CURRENT_BRANCH`
if [ -n "$exists" ]; then
git pull origin $CURRENT_BRANCH
fi
make generate
注意点
Swiftのバージョンが最新安定版のXcodeに同梱しているものと合わない場合は依存関係の構築に失敗することがあるようです。なるべく最新安定版のXcodeとそこに同梱しているSwiftを利用するようにしましょう。
まとめ
まだ開発環境にXcodeGenが導入されただけなので運用自体は今後やっていくことになりますが、まずはコンフリクトが減って開発が快適になることを期待しています。今後もノ社の改善活動で公開できる物があれば記事にしていこうと思います。