LoginSignup
6
5

More than 5 years have passed since last update.

XcodeのbuildSettingsをxcconfigに展開するスクリプトを書きました

Last updated at Posted at 2017-04-10

この作業いつも手でやっていたのですが、さすがに面倒になってきてスクリプトをガッと書いてみました。
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にも対応しています。

以上です!

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5