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

Dav*_* T. 3 xcode plist ios xcode-project

我想project.pbxproj使用命令行直接进行编辑(对于CI服务器脚本)

哪些工具可以让我做到这一点?

我曾经用来PlistBuddy编辑输出Info.plist;但是,我真正想做的是编辑此用户定义的字段,该字段已在多个地方使用,而且我真的不想在每个plist位置都查找它

Daw*_*ong 6

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
Run Code Online (Sandbox Code Playgroud)

这样设置其值,

/usr/libexec/PlistBuddy -c 'set :objects:A83311AA20DA4A80004B8C0E:buildSettings:LZD_NOTIFICATION_SERVICE_BUNDLE_ID com.dawnsong.notification-service' LAAppAdapter.xcodeproj/project.pbxproj
Run Code Online (Sandbox Code Playgroud)

  • 使用“project.pbxproj”打印值似乎工作正常,但是当我使用“set”命令时,整个project.pbxproj会转换为XML .plist文件,并且Xcode无法再读取。 (4认同)
  • @sachadso 找不到解决方案,所以我不再尝试乱搞 .pbxproj 文件。 (2认同)

Mig*_*g82 5

我知道这已经回答了一段时间了,但是由于最初的问题是关于支持.pbxproj文件操作的工具,而且许多其他人可能正在寻找相同的信息,因此我将按照以下方法进行操作。我花了相当长的时间才弄清楚这一点,因为当我开始尝试进行此操作时,我对Xcode并不熟悉,因此我希望这可以节省其他人的时间。

您可以使用该plutil命令将.pbxproj文件从传统.plist格式转换为XML或JSON格式,从而可以更轻松地进行操作。我正在使用JSON。为此,只需运行:

plutil -convert json project.pbxproj
Run Code Online (Sandbox Code Playgroud)

这将转换的格式project.pbxproj,但请注意-与常识相反-输出将不是具有JSON扩展名的另一个文件,例如project.json。将会发生的事情是project.pbxproj将其转换为JSON格式,但保留其神秘的.pbxproj扩展名。因此,即使文件的格式已更改,Xcode仍会选择它并以其新的JSON格式使用它。

然后,您可以project.pbxproj使用所选的任何JSON操作工具轻松地进行更改。我JsonSlurper在Groovy脚本中使用Groovy的类。

注意,我也探索了XML选项,但发现project.pbxprojXML格式的文件解析起来很麻烦。元素未正确嵌套,因此无法轻松遍历树。困扰着:

<key>someKey</key>
<dict>
    <!--More elements which provide configuration for the key above-->
</dict>
Run Code Online (Sandbox Code Playgroud)

因此,它本质上是定位的。您必须查找key与要操作的设置相对应的元素,然后跳转到紧随其后的dict元素。这意味着您必须将每个XML元素的子代装入数组,以便对其进行索引。


Lar*_*erg 5

以下是 3 个实现 .pbxproj 文件编辑的开源工具:

就个人而言,我使用基于 NodeJS 的工具获得了最佳体验。到目前为止,它已经可靠地满足了我们的所有需求。这是一个模块,用于设置开发人员团队 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())
})
Run Code Online (Sandbox Code Playgroud)

上面的脚本可以执行

yarn run update-project <arguments...>

鉴于update-project注册于package.json

{
  ...,
  "scripts": {
    ...
    "update-project": "node update-project.js"
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)