チーム開発を行っているとき、プロジェクトファイルがよくコンフリクトします。
参考:
本記事は、他の記事を見ながら実際にやってみた、いわゆる備忘録となっています。
「まだ情報は集まってない…」
「とりあえず試したい…」
そんな方には役立てられるかと。
目次
Qiita なら必要ないかと思うけど一応
Xcode Gen とは
そもそもの話、なぜ Xcode Gen を使うのか。
それは、プロジェクトファイルである *.xcodeproj
が毎度 conflict するので、それを未然に防ぎたいという考えです。
なぜ conflict するかというと、*.xcodeproj
内にあるファイルのアドレスが原因です。
あるブランチでは、ファイルを追加する。
別のブランチでも、ファイルを追加する。
このとき、*.xcodeproj
ではコードとしても変更があるのですが…
…何と、同じところにファイルに関するコードが増えています。
これが原因です。
じゃあどうすればいいのか。
*.xcodeproj
に変わる、プロジェクトの概要を管理するファイル…
project.yml
(ヤムル)を使ってバージョン管理をすればいいのです。
project.yml
は、ファイル・フォルダ構造を管理しません。
そのため当然、conflict地獄 は発生しない。
そして、Xcode Gen で project.yml
を使えば、
いつでも*.xcodeproj
を生成・更新することができます。
導入
まずは Xcode gen をターミナルでインストールする。
インストールする方法は、3種類ある模様。
- Homebrew によるインストール方法
- Mint を使ったインストール方法
- 手動でインストール
Homebrew によるインストール方法
brew install xcodegen
パッケージ管理の Homebrew をインストールしておく必要あり。
どのみち Homebrew は必要になるので、やってない方はこの際使ってみるといいでしょう。調べてみてね。
Mint を使ったインストール方法
mint install yonaskolb/xcodegen
これに関しては記事冒頭の参考記事を見たほうがいいかと思います。
Mintについても調べてみてね。こっちのほうがいいかも。
手動でインストール
git clone https://github.com/yonaskolb/XcodeGen.git
cd XcodeGen
make install
手動による方法は、バージョン管理的にオススメはしない。
yml を作成
まずは、ターミナルでプロジェクトのフォルダまで遷移して、このymlファイルを作る。
本記事では、使用するプロジェクト名は「Imager」とします。(作りかけ…?いえ、そんなことはないです。)
cd Imager
touch project.yml
なんかできてます。
これが ymlファイルですね。
yml を編集
*.xcodeproj
を管理しない代わりに、必要な設定をproject.yml
で管理する必要があります。
ymlファイルに書き込むべき大まかな項目は、以下の通り。
本記事では 必須 項目のみ説明します。
初期状態であれば、必須項目だけでもしっかりビルドできます。デキナカッタラゴメンネ
※本記事では、使用するプロジェクト名は「Imager」とします。
name
name: Imager
・naem
必須
プロジェクト名を書くだけです。
ここは簡単ですね。
options
プロジェクトそのもののオプション。
options:
bundleIdPrefix: com.imager
deploymentTarget:
iOS: 14.1
developmentLanguage: ja
postGenCommand: pod install
・bundleIdPrefix
必須
各ターゲットに共通の bundleId を設定する。
ここに入力しておくと、下記にある targets で PRODUCT_BUNDLE_IDENTIFIER
を記述する必要がなくなる模様。
・deploymentTarget
必須
開発するプラットフォームのバージョンを指定する。
iOSアプリ開発であれば、iOSのバージョンだけ書けばおk。
・developmentLanguage
デフォルトの Language を設定できる。
この項目を記入しなかった場合は、en
になる。
・postGenCommand
CocoaPods を使用している場合は、この項目に pod install
と記入しておくと便利。
これだけで、$ xcodegen generate
した際に pod install
までしてくれる。
settings
各ターゲット共通で使う Build Settings 用のパラメータ設定。
settings:
base:
MARKETING_VERSION: 1.0.0
CURRENT_PROJECT_VERSION: 1
DEVELOPMENT_TEAM: XXXXXXXXXX
・MARKETING_VERSION
General にある、 Version 管理用パラメータ。
リリース時のバージョンを指定するアレですね。Ver1.0.0みたいな。
初期設定では紐付けされていないので、Info.plist
にて紐付けしておきましょう。
Bundle version string (short): $(MARKETING_VERSION)
・CURRENT_PROJECT_VERSION
General にある、 Build 管理用パラメータ。
ビルド時のバージョン管理用。開発者側にしか見えない。
初期設定では紐付けされていないので、Info.plist
にて紐付けしておきましょう。
Bundle version : $(CURRENT_PROJECT_VERSION)
・DEVELOPMENT_TEAM
必須
Signing & Capabilities にある、開発チームのID。
元々使用されているパラメータですね。
Xcode内ではわからないかと思うので、*.xcodeproj
を「パッケージの内容を表示」で開くと見える、 project.pbxproj
の中身を見てみましょう。同名のパラメータがあります。
targets
初期に存在する3ターゲットですね。
ターゲット毎に設定してあげる必要があります。
targets:
Imager:
type: application
platform: iOS
sources: Imager
settings:
base:
INFOPLIST_FILE: Imager/Info.plist
ImagerTests:
type: bundle.unit-test
platform: iOS
sources: ImagerTests
settings:
base:
INFOPLIST_FILE: ImagerTests/Info.plist
dependencies:
- target: Imager
ImagerUITests:
type: bundle.ui-testing
platform: iOS
sources: ImagerUITests
settings:
base:
INFOPLIST_FILE: ImagerUITests/Info.plist
dependencies:
- target: Imager
・type
必須
ターゲットのタイプ
上のコードを見た方が、早そうですね。
・platform
必須
対応プラットフォーム
iOSアプリ開発なら、iOS
とだけ。
・sources
必須
ソースフォルダ名
これがないと、フォルダ内の構成が反映されません。
フォルダ構成は、どうやらここで参照したフォルダの中身を元に作られるみたいですね。
*.xcodeproj
と違って、独自のファイルツリーが存在しない。
だからコンフリクトもしない。便利ですね。
・INFOPLIST_FILE
Info.plist
のファイルパス。無くてもデフォルトの値が入る。
・target
Testing の Host Application を設定する、テスト用の項目。
テストを使うなら必須。
参考:
xcodeproj ファイル生成
project.yml
がある程度完成したら、
ターミナルで、ルートディレクトリまで遷移して以下のコマンドを打つ。
xcodegen generate
これで、*.xcodeproj
が生成されます。
ちなみに、CocoaPods を使用している場合は、project.yml
に以下の記入を忘れずに。
ジェネレート時にまとめて pod install
も行ってくれる。
options:
postGenCommand: pod install
$ xcodegen generate
⚙️ Generating plists...
⚙️ Generating project...
⚙️ Writing project...
Created project at /Users/XXXXX/XXXXX/Imager/Imager.xcodeproj
Analyzing dependencies
Downloading dependencies
...
Created project
の後は、全てpod側の処理ですね。
しっかり *.xcodeproj
(pod 有りなら *.xcworkspace
も含めて)が生成されていれば、大丈夫です。
ビルドも正常にできるかと。
バージョン管理から外しておく
こうなってしまえば、*.xcodeproj
と *.xcworkspace
は使い捨てでいいので、管理する必要ありませんね。
.gitignore
に登録して、git のバージョン管理から外しましょう。
ちなみに .gitignore
ファイルの生成は、ターミナルで打つだけ。
cd Imager
touch .gitignore
.gitignore
は隠しファイルです。
通常では見えません。
Finder では、"command" + "shift" + "." とコマンド入力すれば、見えるようになります。
終わったらもう一度コマンド入力して、元に戻しましょう。
後は適当に書いておきましょう。
Pods もぶちこめ。
Pods
*.xcodeproj
*.xcworkspace
ということでね
必要に応じて、追加の設定を加えて行こうかなぁと考えています。
ライブラリに関しても、 CocoaPods しか仮定していないので…
リリース用ならもっと必要項目が…
とりあえず、入門編としての記事は以上ということでね。
細かい詳細に関する記事は、そのうちに…ね。
何か至らぬ点がありましたら、コメントをいただけると幸いです。