我想使用命令行(对于CI服务器脚本)直接编辑project.pbxproj
哪些工具可以让我这样做?
我曾使用PlistBuddy
编辑输出Info.plist
;但是,我真正想做的是编辑这个用户定义的字段,该字段在多个地方使用,我真的不想在每个plist位置捕获它
答案 0 :(得分:4)
我知道这已经回答了一段时间,但由于最初的问题是关于支持操作.pbxproj
文件的工具,而且许多其他人可能正在寻找相同的信息,这里有怎样的我做到了我花了很长时间来弄明白这一点,因为当我开始尝试这个时,我对Xcode非常不熟悉,所以我希望这可以为其他人节省我必须投入的悲伤时间。
您可以使用plutil
命令将.pbxproj
文件从旧版.plist
格式转换为XML或JSON格式,以便您更轻松地操作。我正在使用JSON。为此,请运行:
plutil -convert json project.pbxproj
这将转换project.pbxproj
的格式,但要注意 - 与常识相反 - 输出不会是具有JSON扩展的另一个文件,例如project.json
。会发生什么是project.pbxproj
将转换为JSON格式,但保留其隐藏的.pbxproj
扩展名。因此,即使文件的格式已经更改,Xcode仍然会将其拾取并以新的JSON格式使用它。
然后,您可以使用您选择的任何JSON操作工具轻松更改project.pbxproj
。我在Groovy脚本中使用了Groovy的JsonSlurper
类。
注意我还研究了XML选项,但我发现XML格式的project.pbxproj
文件很难解析。元素未正确嵌套以允许轻松遍历树。它受到以下困扰:
<key>someKey</key>
<dict>
<!--More elements which provide configuration for the key above-->
</dict>
所以它的位置性质。您必须查找与您要操作的设置相对应的key
元素,然后跳转到它之后的dict
元素。这意味着您必须将每个XML元素的子元素挂载到一个数组中,以便为它们编制索引。
答案 1 :(得分:1)
project.pbxproj
也是old-style ASCII property list文件。因此,您可以使用/usr/libexec/PlistBuddy
对其进行编辑。
像这样打印一些用户定义键的值,
# Get the key A83311AA20DA4A80004B8C0E in your project.pbxproj
# LZD_NOTIFICATION_SERVICE_BUNDLE_ID is defined by me,
# Replace key paths with your own.
/usr/libexec/PlistBuddy -c 'print :objects:A83311AA20DA4A80004B8C0E:buildSettings:LZD_NOTIFICATION_SERVICE_BUNDLE_ID' LAAppAdapter.xcodeproj/project.pbxproj
像这样设置其值
/usr/libexec/PlistBuddy -c 'set :objects:A83311AA20DA4A80004B8C0E:buildSettings:LZD_NOTIFICATION_SERVICE_BUNDLE_ID com.dawnsong.notification-service' LAAppAdapter.xcodeproj/project.pbxproj
答案 2 :(得分:1)
以下是3种实现.pbxproj文件编辑的开源工具: