繁体   English   中英

如何以编程方式将运行脚本构建阶段添加到 Xcode 项目?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM