この作業いつも手でやっていたのですが、さすがに面倒になってきてスクリプトをガッと書いてみました。
https://github.com/toshi0383/xcconfig-extractor
Update: その後Swiftにポートして、いろいろと機能追加しています。
プロジェクト及びそれぞれのターゲットのBuild Settingsの値をそれぞれ別々のxcconfigに書き出します。
例えばApp.xcodeprojの中にApp, AppTests, AppUITestsの3つのターゲットがあるとしたら、以下の通りxcconfigが生成されます。Debug, Release以外のConfigurationがあれば、その分もちゃんと出力されます。
$ main.sh App.xcodeproj/project.pbxproj configs
$ ls configs/
Base-Debug.xcconfig
Base-Release.xcconfig
App-Debug.xcconfig
App-Release.xcconfig
AppTests-Debug.xcconfig
AppTests-Release.xcconfig
AppUITests-Debug.xcconfig
AppUITests-Release.xcconfig
書き出したらawkでbuildSettingsを削っています。ここは見てもらうと正規表現が力技すぎて笑えると思います。
それぞれBaseを #include
しても良いのですが、必ずしもそうしたい場合ばかりではないと思うので、シンプルにそれぞれ書き出して終わり!にしています。
そのあとのxcodeprojへのファイル追加を自動化するにはシェルでは限界があるので、それ用にコマンドでも作ったほうがいいのだろうなーと思っています。
Tips
pbxprojはPlistBuddyで読める
内部の処理はPlistBuddyのPrintコマンドで成り立っています。pbxprojはPlist形式の亜種だとかどこかで聞いた気がして、使ってみたら普通に読めました。さすがにAddとかSetを使うと<key>hoge</key>
みたいなデータが書き込まれてしまってダメでしたが。
もちろん、plutil -p
でも読めますが、出力される形式が若干違いました。
pbxprojのobjectのIDはなんでも良い
Xcodeで生成すると24桁のハッシュみたいになってますが、その形式にこだわる必要はないようです。
swift package init --type empty && swift package generate-xcodeproj
としてxcodeprojを生成してみると objectのIDは OBJ_1
とか設定されていました。ファイル内で一意になっていればいいようです。
SwiftPMで生成したxcodeprojをXcodeから編集すると差分がpbxprojファイル全体に出る
SwiftPMで生成したxcodeprojを少しでもXcodeから触ると差分がツラいことになりました。SwiftPMで生成すると*.xcodeproj
を.gitignore
に含めてくるので、そもそもそういう互換性は考えられていないのではと思います。もちろん互換性がないわけではなくて、触ると差分が出てしまうというだけなのですが、何も変えていないつもりの部分は差分も出ないでほしいところですよね。。
一応今回作成したツールではどちらのpbxprojにも対応しています。
以上です!