【Swift】XcodeGenの使い方!プロジェクト(.xcodeproj)管理ツール
この記事からわかること
- XcodeGenの使い方と導入方法
- プロジェクトファイル(.xcodeproj)の管理方法
- project.ymlの記述方法
- Cannot code sign because the target does not have an Info.plist file and one is not being generated automaticallyの解決
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
XcodeGenとは?
XcodeGenとはXcodeのプロジェクトファイル(.xcodeproj)を自動生成するコマンドラインツールです。1人での開発では発生しにくいですが、共同開発をする際にプロジェクトファイル(.xcodeproj)がコンフリクトすることがあり、その解消はややこしくわかりづらい部分が多いです。
XcodeGenを使用することでプロジェクトファイル(.xcodeproj)の設定情報を別のYAML形式のテキストファイルとして保持しておくことでそのファイルを元に何度でもプロジェクトファイル(.xcodeproj)を自動生成できるようになります。中身も見やすいためコンフリクトが起きても修正が容易く、誰でも同じ設定のプロジェクトファイル(.xcodeproj)が生成できるので環境の違いが生まれにくくなります。
設定できること
XcodeGenで生成するYAML形式のテキストファイルは「project.yml」になっていることが多いです。このファイル内にプロジェクトの設定を自身で記述していく必要があります。
設定できること
- ターゲット
- 構成
- スキーム
- カスタムビルド設定
- etc..
設定できることが多岐に渡りますが、それぞれ細かい記法があるので詳細は公式リファレンスを確認してください。
導入方法
XcodeGenはコマンドラインツールなのでプロジェクトごとにではなく、ターミナルに導入していきます。導入するにはパッケージ管理システムであるHomebrewやmintなどを使用します。
Homebrew
$ brew install xcodegen
おすすめ記事:Homebrew(ホームブルー)のインストール方法
mint
$ mint install yonaskolb/xcodegen
Mintを使用する場合はコマンドの前にmint run [パッケージ名]
をつける必要があるので注意してください。
project.ymlの設置
「project.yml」は自動生成されないので自分で用意する必要があり余す。プロジェクト内に移動し以下コマンドで空のファイルを生成します。
$ touch project.yml
中に以下のようにXcodeプロジェクトで必要な情報を記述します。細かいところは後述します。
# プロジェクト名
name: XcodeGenTest
# バンドルID
options:
# バンドルプレフィックス
bundleIdPrefix: com.dev
# LocalizationsのDevelopment Languageを指定
developmentLanguage: ja
# ターゲットごとの設定
targets:
XcodeGenTest:
# ターゲットの製品タイプ
type: application
# ターゲットのプラットフォーム
platform: iOS
# デプロイメントターゲット
deploymentTarget: "15.0"
sources:
- XcodeGenTest
info:
path: XcodeGenTest/Info.plist
properties:
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
CFBundleShortVersionString: $(MARKETING_VERSION)
LSRequiresIPhoneOS: YES
UILaunchScreen: ""
UIApplicationSupportsIndirectInputEvents: YES
UIApplicationSceneManifest:
UIApplicationSupportsMultipleScenes: YES
UISupportedInterfaceOrientations~iphone:
[UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
UISupportedInterfaceOrientations~ipad:
[UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
settings:
base:
MARKETING_VERSION: 1.0.0
CURRENT_PROJECT_VERSION: 1
DEVELOPMENT_TEAM: XXXXXXXXXX
プロジェクトファイル(.xcodeproj)の自動生成
「project.yml」を設置できたらxcodegen generate
コマンドを使用してプロジェクトファイル(.xcodeproj)を生成します。すでに存在する場合でも自動生成されたものに置き換わります。
$ xcodegen generate
// Mintの場合
$ mint run xcodegen xcodegen generate
成功すると以下のようなログが出力されます。
🌱 Finding latest version of xcodegen
🌱 Running xcodegen 2.37.0...
⚙️ Generating plists...
⚙️ Generating project...
⚙️ Writing project...
Created project at 省略/XcodeGenTest/XcodeGenTest.xcodeproj
これで生成が完了したのでプロジェクトファイルを開いてみてください。正常にビルドできるはずです。
※「Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically」というエラーが出たらこちらを確認してください。
project.ymlに設定できる値と記述方法
基本的にビルドするために必要な設定を紹介していきます。詳細は公式リアファレンスを参照してください。
プロジェクト名
name: XcodeGenTest
BundleID
BundleIDはbundleIdPrefix
で始まり部分のみを指定でき、プロジェクト名と繋がり、com.dev.XcodeGenTest
となります。
# バンドルID
options:
# バンドルプレフィックス
bundleIdPrefix: com.dev
Localizations
プロジェクトのLocalizationsもここから指定できます。
options:
# LocalizationsのDevelopment Languageを指定
developmentLanguage: ja
ターゲット
プロジェクト内のターゲットごとに細かい設定を変更できます。sources
がないとターゲットがどこのディレクトリ内を参照したら良いか識別できないので忘れないようにしてください。
# ターゲットごとの設定
targets:
XcodeGenTest:
# ターゲットの製品タイプ
type: application
# ターゲットのプラットフォーム
platform: iOS
# デプロイメントターゲット
deploymentTarget: "15.0"
sources:
- XcodeGenTest
info.plist
info.plist内のキーと値も設定することが可能です。Swift UIでXcodeGenを使用してみたところ、明示的にinfo.plistの設定を記述しないとエラーになるようです。これはSwift UIにはデフォルトで「info.plist」が存在しないことが原因のようです。
info:
path: XcodeGenTest/Info.plist
properties:
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
CFBundleShortVersionString: $(MARKETING_VERSION)
LSRequiresIPhoneOS: YES
UILaunchScreen: ""
UIApplicationSupportsIndirectInputEvents: YES
UIApplicationSceneManifest:
UIApplicationSupportsMultipleScenes: YES
UISupportedInterfaceOrientations~iphone:
[UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
UISupportedInterfaceOrientations~ipad:
[UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
上記は以下の記事を参考にさせていただきました。
GitHub:マクネコアユ/SwiftUISampleWithXcodeGen
バージョンやビルド番号
プロジェクト内でのアプリのバージョンやビルド番号、開発チームは以下のように指定できます。
settings:
base:
MARKETING_VERSION: 1.0.0
CURRENT_PROJECT_VERSION: 1
DEVELOPMENT_TEAM: XXXXXXXXXX
Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically
Swift UIでXcodeGenを使用中にビルドしようとしたら以下のようなエラーが発生しました。
Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically. Apply an Info.plist file to the target using the INFOPLIST_FILE build setting or generate one automatically by setting the GENERATE_INFOPLIST_FILE build setting to YES (recommended).
翻訳
ターゲットに Info.plist ファイルがなく、自動的に生成されていないため、コード署名できません。 INFOPLIST_FILE ビルド設定を使用してターゲットに Info.plist ファイルを適用するか、GENERATE_INFOPLIST_FILE ビルド設定を YES (推奨) に設定して Info.plist ファイルを自動的に生成します。
これはSwift UIにはデフォルトで「info.plist」が存在しないことが原因のようで明示的にinfo.plistの設定をproject.ymlに記述しないとエラーになるようです。
ご覧いただきありがとうございました。