哪些工具支持编辑project.pbxproj文件?

问题描述 投票:0回答:4

我想使用命令行直接编辑

project.pbxproj
(对于 CI 服务器脚本)

什么工具可以让我做到这一点?

我曾经使用

PlistBuddy
来编辑输出
Info.plist
;然而,我真正想做的是编辑这个用户定义的字段,它在多个地方使用,而且我真的不想在每个 plist 位置中寻找它

ios xcode plist xcode-project
4个回答
22
投票

project.pbxproj
也是一个旧式 ASCII 属性列表 文件。所以你可以使用
/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

更新
自 macOS Catalina(或某些早期版本)以来,

PlistBuddy
会自动将
project.pbxproj
转换为 xml 格式的 plist 文件。最好将设置项移动到
xcconfig
文件中
,因为
xcconfig
project.pbxproj
更小更简单,并且用
perl
脚本编辑时不容易出错。


20
投票
我知道这个问题已经得到解答一段时间了,但由于最初的问题是关于支持操作

.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
 类。

Note 我也探索了 XML 选项,但我发现 XML 格式的 project.pbxproj

 文件解析起来很麻烦。这些元素没有正确嵌套,无法轻松遍历树。它受到以下问题的困扰:

<key>someKey</key> <dict> <!--More elements which provide configuration for the key above--> </dict>

所以它本质上是位置性的。您必须查找与要操作的设置相对应的

key

 元素,然后跳转到其后面的 
dict
 元素。这意味着您必须将每个 XML 元素的子元素安装到一个数组中,以便为它们建立索引。  


10
投票
这里有3个实现.pbxproj文件编辑的开源工具:

就我个人而言,我使用基于 NodeJS 的工具获得了最佳体验。到目前为止,它已经可靠地满足了我们所有的需求。

下面列出了一个示例 javascript 文件

update-project.js

,它设置开发团队 ID、应用程序权利、向项目添加 
GoogleService-Info.plist
 文件并将其检查为构建目标的一部分。以此为灵感,根据您的需求调整脚本及其路径:

const fs = require('fs') const xcode = require('xcode') if (process.argv.length !== 3) { console.error("Please pass the development team ID as the first argument") process.exit(1) } const developmentTeamId = process.argv[2] const path = 'ios/App/App.xcodeproj/project.pbxproj' const project = xcode.project(path) project.parse(error => { const targetKey = project.findTargetKey('App') const appGroupKey = project.findPBXGroupKey({path: 'App'}) project.addBuildProperty('CODE_SIGN_ENTITLEMENTS', 'App/App.entitlements') project.addBuildProperty('DEVELOPMENT_TEAM', developmentTeamId) project.addFile('App.entitlements', appGroupKey) project.removeFile('GoogleService-Info.plist', appGroupKey) const f = project.addFile('GoogleService-Info.plist', appGroupKey, {target: targetKey}) f.uuid = project.generateUuid() project.addToPbxBuildFileSection(f) project.addToPbxResourcesBuildPhase(f) fs.writeFileSync(path, project.writeSync()) })
上面的脚本可以用

执行

yarn run update-project <arguments...>


鉴于

update-project

 已在 
package.json
 中注册:

{ ..., "scripts": { ... "update-project": "node update-project.js" }, ... }
    

0
投票
正确且开门见山的答案是 Downsong 和 Mig82 的混合。

首先检查您的project.pbxproj 文件并获取要在我的示例中修改的不同键

AABBCCDDEEFF

然后使用

PlistBuddy

 设置您想要的值。下面是带有 
value
 的配置文件:

/usr/libexec/PlistBuddy -c 'set :objects:AABBCCDDEEFF:buildSettings:PROVISIONING_PROFILE_SPECIFIER value' myproject.xcodeproj/project.pbxproj
这将修改 pbxproj 文件并将其转换为 

XML

 格式。

使用 Mig82 提供的命令将其转换回原始 (

json

) 格式:

plutil -convert json myproject.xcodeproj/project.pbxproj
    
© www.soinside.com 2019 - 2024. All rights reserved.