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

11

我想知道是否可能在我的Mac实用程序应用程序中向另一个Xcode项目添加运行脚本构建阶段。我可以看到当添加运行脚本时Xcode项目发生了什么(执行差异比较),但我不知道如何安全地在代码中添加等效内容。

我是不是应该手动解析它?是否有文档或库可用于此?如果我能确保安全和正确,这将是一个有用的功能。我不想搞乱人们的Xcode项目!

4个回答

8

对于任何想要简单完成此操作的人,有一个很好的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脚本,一切都应该没问题了。

2
我运行了脚本,完全搞乱了我的项目。 - Reimond Hill

5

我的解决方案需要一点 Ruby 知识。有一个叫做 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

编辑:在查找中将“=”替换为“==”,否则第一个脚本将被替换,我们需要进行追加


3
可能最简单的解决方案是在另一个项目中添加一个“运行脚本”阶段,并定义一个命令行,执行一个特定位置上某个已知文件中的脚本。
然后,第一个项目可以有一个“运行脚本”阶段,或者执行一个程序来创建或修改此脚本文件。当另一个项目启动时,它将启动“运行脚本”阶段,然后执行已定义的内容。

谢谢你的回答!我还在努力理解 :). 我的Mac应用程序已经上架,我现在想做的是在我的应用程序中添加一个按钮,可以将“运行脚本阶段”添加到用户在文件系统中指定的任何项目中。它需要在运行时完成。终端仍然是最好的选择吗? - Lizza
1
好的,这可能会变得比较复杂(在Xcode项目的XML中摆弄)。也许,一个初步的解决方案是让你的应用程序创建一个脚本文件,并告诉用户如何在“运行脚本阶段”中执行该脚本文件。这个“运行脚本阶段”需要由用户在他的项目中添加。 - CouchDeveloper
好的。这个问题的目的是想看看是否可能和可行。我不想冒着损坏他人项目文件的风险,所以最好寻找一个解决方法。谢谢! - Lizza
不客气,我也会感到抱怨,当我知道实用程序在我的Xcode项目中摆弄时... ;) - CouchDeveloper

2
我决定添加一个运行脚本,这其实很容易。首先,在Xcode中,将运行脚本添加到你的项目中,并通过diff工具观察更改。在“buildPhases”数组中添加了一个条目(该数组嵌套在一些任意命名的字典中),然后将添加到“buildPhases”数组的键也添加到“objects”字典中,该字典表示实际的运行脚本构建阶段格式。
因此,要以编程方式复制此操作,请将pbxproj文件的内容获取到NSDictionary中,并遍历字典以查找buildPhases数组。然后添加你的键。最后,添加一个对象到“objects”数组中,其中包含与Xcode中格式相似的字典。
将文件保存回同一位置,完成!你已经以编程方式添加了一个运行脚本构建阶段。

4
你是在什么时候以及什么方式运行这段代码的?它是用 Swift 脚本编写的吗?你介意在这里或者类似 gist 的平台分享一下吗? - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接