[英]How can I programmatically add a run script build phase to an Xcode project?
我想知道是否可以从我的 Mac 实用程序应用程序中将运行脚本构建阶段添加到另一个 Xcode 项目。 我可以看到添加运行脚本(执行差异)时 Xcode 项目中发生的情况,但我不知道如何在代码中安全地添加等效项。
我应该手动解析它吗? 是否有可用的文档或库? 如果我可以确保安全正确地执行此操作,这将是一个有用的功能。 我不想弄乱人们的 Xcode 项目!
对于任何寻找简单方法来做到这一点的人来说,有一个很棒的 python 库可以让你.pbxproj
文件中的所有类型的东西。 你可以在这里查看: https : //github.com/kronenthaler/mod-pbxproj 。
现在要添加运行脚本构建阶段,您可以编写一个简单的 python 脚本,例如:
from pbxproj import XcodeProject
import sys
project = XcodeProject.load('path/to/my-project.xcodeproj/project.pbxproj')
project.add_run_script('bash my_run_script.sh')
project.save()
现在只需运行 python 脚本,你就可以开始了。
可能最简单的解决方案是向另一个项目添加一个运行脚本阶段,该项目定义了一个命令行执行脚本,该脚本作为某个已知位置的特定文件驻留。
然后第一个项目可能有一个运行脚本阶段,或者执行一个创建或修改这个脚本文件的程序。 当另一个项目启动时,它会启动运行脚本阶段 - 瞧 - 执行已定义的任何内容。
我的解决方案需要一点红宝石知识。 有一个名为xcodeproj的库,它包含在 Cocoapods 中
sudo gem install cocoapods
或者,
gem install xcodeproj
只安装库。
要创建将运行脚本阶段添加到目标中的 ruby 文件:
require 'xcodeproj'
project = Xcodeproj::Project.open "./TargetTest.xcodeproj"
for target in project.targets
puts "Target -> " + target.name
phase = target.shell_script_build_phases().find {|item| item.name == "My run phase"}
if (phase.nil?)
puts "Creating script 'My run phase'"
phase = target.new_shell_script_build_phase("My run phase")
phase.shell_script = "echo Hello script"
else
puts "'My run phase' already exist"
phase.shell_script = "echo modified"
end
end
project.save()
你可以运行它:
ruby add_run_phase_script.rb
编辑:在find中用“==”替换“=”,否则第一个脚本将被替换,我们需要一个append
我实际上决定添加一个运行脚本。 结果很容易。 首先,在 Xcode 中,将运行脚本添加到您的项目并通过 diff 工具观察更改。 'buildPhases' 数组中有一个附加项(它嵌套在一些任意命名的字典中很深的地方),然后添加到 'buildPhases' 数组的键也被添加到带有字典的 'objects' 字典中表示实际运行脚本构建阶段格式。
因此,要以编程方式复制此内容,请将 pbxproj 文件的内容放入 NSDictionary,并遍历字典以查找 buildPhases 数组。 然后,添加您的密钥。 最后,使用键和反映 Xcode 格式的字典将一个对象添加到 'objects' 数组。
将文件保存回磁盘的同一位置,瞧! 您已以编程方式添加了运行脚本构建阶段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.