この記事は豊田高専コンピュータ部アドベントカレンダー1日目の記事です
XcodeGenとは
iOSアプリ開発で複数人での開発をすると色々とつらいことがあるのでそのつらいことをなるべく無くそうという感じのツールです。具体的にはプロジェクトへのファイルの追加など行うとプロジェクトファイルが書き換わるのですが、そのプロジェクトファイルは人間におおよそ理解のできない形式で書かれており、チーム開発をしているとそれが恐ろしいコンフリクトを生み、その解消がとてもつらいという問題があります。そのプロジェクトファイルをコード(yaml)から生成することでチーム開発をやりやすくしようという感じのツールになります。
https://github.com/yonaskolb/XcodeGen
触ってみる
なにはともあれ百聞は一見にしかずなので触ってみましょう。まずはXcodeGenをインストールします
$ brew install xcodegen
XcodeGenを入れられたら次はXcodeのプロジェクトを作成します。プロジェクト名は今回は「SampleGen」とします。プロジェクトの作成手順は今回は割愛します。
プロジェクトを作成できたらプロジェクトファイルの内容をproject.yml
に書き起こしていきます。
# プロジェクト構成・設定
name: SampleGen
configs:
Debug: debug
Release: release
options:
groupSortPosition: top
attributes:
ORGANIZATIONNAME: ymgn
fileGroups:
- SampleGen
- SampleGenTests
# ターゲット
targets:
SampleGen:
type: application
platform: iOS
sources:
- path: SampleGen
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ymgn.SampleGen
ASSETCATALOG_COMPIER_APPICON_NAME: AppIcon
INFOPLIST_FILE: SampleGen/Info.plist
configs:
Debug:
GCC_OPTIMIZATION_LEVEL: O
Release:
GCC_OPTIMIZATION_LEVEL: s
SampleGenTests:
type: bundle.unit-test
platform: iOS
dependencies:
- target: SampleGen
settings:
TEST_HOSTS: $(BUILT_PRODUCTS_DIR)/SampleGen.app/SampleGen
INFORPLSIT_FILE: SampleGenTests/Info.plist
sources:
- SampleGenTests
# スキーム
schemes:
SampleGen:
build:
targets:
SampleGen: all
run:
config: Debug
test:
config: Debug
gatherCoverageData: true
targets:
- SampleGenTests
profile:
config: Release
analyze:
config: Debug
archive:
config: Release
要素一つ一つを説明するのはつらいのでXcodeGenのリポジトリにあるドキュメントを参照してもらうとして、プロジェクトファイルの項目に対応した要素が存在します。プロジェクトファイルからyamlへの書き起こしは手で書きましたが、自動で書き起こしてくれる方法などあればぜひコメントで教えてください。
project.yml
はプロジェクトファイルと同じ階層に配置し、プロジェクトに追加する必要はありません。
project.ymlが出来上がったらプロジェクトファイルは削除しても構いませんが、写しミスがあった場合悲しいので残しておくとよいでしょう。
project.ymlがあるディレクトリで
$ xcodegen generate
を実行するとプロジェクトファイルを生成します。既存のプロジェクトファイルがある場合は書き換えられます。
最低限の実装になっているのでそのままビルドするとおそらくSigningでエラーが出ると思いますので、Teamは手動で追加してもらうとエラーは消えるはずです。
これで一通りの導入は終了です。
まとめ
上記では手順だけ示したのであまり恩恵がわからないかもしれませんが、targetの追加や、ライブラリ、Embeded Frameworkの追加などもproject.ymlで記述できるのでコマンド一発でどの環境でもコンフリクトのない状態のプロジェクトファイルが生成されます。実際に使用する際はプロジェクトファイルは.gitignoreなどで管理には含めないようにすることに注意してください。
もっと詳しく知りたい場合はXcodeGenのリポジトリや他記事を参照してもらえると多くの設定が利用できたり、設定ファイルを分割できたりすることがわかると思います。iOSアプリのチーム開発で困っている人はぜひ試してみてください。
おまけ
XcodeGenを使ったプロジェクトをBitriseなどのCI/CDツールに載せるとプロジェクトファイルが存在しないため、validationが通らなくて焦るかもしれません。しかし、最初のvalidationが通らなくてもPROJECT_PATHには単に生成される.xcodeproj(もしくは.xcworkspace)のファイル名を入力して、workfrowにXcodeGenをビルド前に実行するようにすればビルドできるようになります。
Bitriseであればこのようにxcodegenのコマンドを使用するためのユーティリティが存在します。