XcodeGenで最低限のXcodeプロジェクトを生成する
Table of Contents
Xcodeプロジェクト(.xcodeproj)のコンフリクトはストレスです。
この記事ではXcodeGenを実際に使って最小プロジェクトを作って使い方を説明します。
もしXcodeGenの特徴やメリットを把握していない場合は、「XcodeGenを基本から理解する 」に詳細をまとめてあります。
最小仕様でXcodeプロジェクトを生成する
XcodeGenの特徴の一つとしてデフォルト値が用意されているので指定がない場合はデフォルト値を使ってXcodeプロジェクトを生成するようです。
空フォルダ上で実行
$ xcodegen generate
No project spec found at /your/workspace/project.yml
プロジェクト仕様ファイルがないと怒られます。ファイルは必要なようです。
空のプロジェクト仕様ファイルで実行
$ xcodegen generate
Parsing project spec failed: Decoding failed at "name": Nothing found
name
のデコードに失敗しました。どうやらname
を探しているようです。
nameを入れたプロジェクト仕様ファイルで実行
次のようにproject.ymlにnameを追加して実行してみます。
$ cat project.yml
name: MinimumProject
$ xcodegen generate
⚙️ Generating plists...
⚙️ Generating project...
⚙️ Writing project...
Created project at /your/workspace/MinimumProject.xcodeproj
どうやら作成に成功したようです。下記スクショのようにファイルもフォルダ設計もターゲットも何もない状態です。
なお今回のファイルはGitHubに上げてますので全体像が分からない場合はこちらを見てください。
iOSプロジェクトを生成する
ではiOSをプラットフォームとした空プロジェクトを目指して見ます。
その前に簡単にXcodeがデフォルトで用意してるテンプレートで目指すゴールを用意します。
ざっと見て追加する点は
- ターゲット
- 表示名
- バンドルID
- バージョン
- ビルド番号
- 端末制限(iOSとiPad)
- 初期表示storyboard
- 画面横向きサポート
- ステータスバー
- アイコンと起動画面
- フォルダとファイルがある
あたりが必要そうです。
ターゲットを追加する
targets:
iOSMinimumProject:
type: application
platform: iOS
targets
の子にはプロジェクト名が入ります。
今回はiOSMinimumProject
というターゲット名にしてます。
type
にはProduct Typeの何れかをセットします。
今回は単純なアプリケーションなのでapplication
になります。
platform
にはPlatformの何れかをセットします。
今回はiOSなのでiOS
になります。
これでxcodegen generate
を実行した結果が下図になります。
プロジェクトは追加されています。 しかしIdentityやDevice Orientationなど中身がスカスカです。今度はこれを埋めていきます。
マルチプラットフォームは[]で囲む
もし複数プラットフォーム対応の場合は
platform: [iOS, tvOS]
のように[]
で囲みます。
Info.plistが必要
IdentityやDevice Orientationなどは元データはXcodeプロジェクトに登録されているのではなく、Info.plistに登録されてます。
なので次はInfo.plistやソースファイルなどが入ったフォルダを用意します。
フォルダ名は任意ですが、iOSMinimumProject
という名前にしときます。
そしてtargetのルートディレクトリとしてsources
プロパティでパスを渡します。
sources: iOSMinimumProject
これでxcodegen generate
を実行すると無事不足してた部分が追加されます。
初期ファイル群は自分で用意が必要
AppDelegate.swiftやInfo.plistなどは自身が追加したファイル同様外部ファイルなため、自分で用意する必要があります。
しかしXcodeGenには特別初期ファイル群を用意する機能は備わっていないようなので、
Xcodeを立ち上げて適当にプロジェクトを生成した後に、一緒に作成される初期ファイル群を使う手間があります。
このことからターゲット追加における最適フローは、
- 一度Xcodeプロジェクトでターゲット作成する
- 作成されたフォルダとファイル類をプロジェクト仕様に使う
という流れが手軽です。
もし違和感覚える方は、「大事なのはXcodeプロジェクト管理を脱却することであり、Xcodeからの脱却ではない」 ことを改めて思い出すと腹落ちするのではないかと思います。
バンドルIDを設定する
キャプチャ見ると分かりますが、Bundle Identifierが空のままです。
これはbundleIdPrefix
プロパティをセットすることでいい感じにセットしてくれます。
このプロパティはtargets
ではなくルートにoptions
を用意してその中でセットとなります。
options:
bundleIdPrefix: com.mothule
これでxcodegen generate
を実行すると無事bundle Identifierがセットされます。
こちらもGitHubに上げてますので全体像が分からない場合はこちらを見てください。
カテゴリ毎の必須プロパティの確認方法
公式のプロジェクト仕様ページには各カテゴリ毎に定義されているプロパティと説明が列挙されています。
そして各プロパティ横のチェックボックスがマークされたものが必須プロパティとなります。
テストターゲットを追加する
実務ではプロダクトターゲットだけでなく単体テストとしてテストターゲットも必要になります。
先程のiOSMinimumProject
にテストターゲットを追加してみます。
Xcodeでテストフォルダを生成する
まず最初にXcodeからUnit Testing Bundle
を選択して追加します。
するとターゲットとそれに紐づくフォルダが追加されるので、ターゲット名をコピーします。
プロジェクト仕様にテストターゲット追加する
そして新しくプロジェクト仕様にターゲットを次のように追加します。
例えばテストターゲット名がiOSWithUTProjTests
だとしたら次のようになります。
targets:
iOSWithUTProjTests:
type: bundle.unit-test
platform: iOS
sources: iOSWithUTProjTests
dependencies:
- target: iOSWithUTProj
新しいプロパティとしてdependencies
とtarget
プロパティがあります。
dependencies
はこのターゲットに依存するライブラリなどを列挙します。
今回はターゲットなのでtarget
プロパティを使い、テスト対象のターゲット名(iOSWithUTProj
)をセットします。
こちらもGitHubに上げてます。
dependencies > targetなくともテストターゲットは追加されるが
dependencies > target
を入れずともXcodeプロジェクトにUTターゲットは生成されます。
が、実行できません。
なぜなら、Testing > Host Application
がNoneになっているためです。
この部分をセットするために、dependencies
を追加してます。
CarthageやCocoaPods環境を構築する
XcodeGenを使って最小プロジェクトからUnitTest付きiOSアプリの最小プロジェクトを作りました。
次はCarthageやCocoaPodsを使ったライブラリ追加を「XcodeGenでCarthageやCocoaPods環境のXcodeプロジェクトを生成する 」で説明します。