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

时间:2013-10-10 17:13:10

标签: ios xcode macos build-process run-script

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

我应该手动解析吗?是否有可用的文档或库?如果我能确保安全,正确地做到这一点,这将是一个有用的功能。我不想弄乱人们的Xcode项目!

4 个答案:

答案 0 :(得分:5)

对于任何寻找简单方法的人来说,有一个很棒的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脚本就可以了。

答案 1 :(得分:3)

最简单的解决方案是将Run Script Phase添加到另一个Project中,该Project定义了一个执行脚本的命令行,该脚本作为某个已知位置的特定文件驻留。

第一个项目可能有一个运行脚本阶段,或执行创建修改此脚本文件的程序。当另一个项目启动时,它会启动Run Script Phase并且 - voilà - 执行已经定义的任何内容。

答案 2 :(得分:1)

我的解决方案需要一些红宝石知识。 Cocoapods包含一个名为xcodeproj的库

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 :(得分:0)

我实际上决定添加一个运行脚本。事实证明这很容易。首先,在Xcode中,向项目添加运行脚本,并通过diff工具观察更改。 'buildPhases'数组有一个补充(在一些任意命名的字典中嵌入很深),然后添加到'buildPhases'数组的键也被添加到'objects'字典中,带有一个字典表示实际运行脚本构建阶段格式。

因此,要以编程方式复制此内容,请将pbxproj文件的内容放入NSDictionary中,然后遍历查找buildPhases数组的字典。然后,添加您的密钥。最后,使用键和一个反映Xcode格式的字典向'objects'数组添加一个对象。

将文件保存回同一位置的磁盘,瞧!您已以编程方式添加了运行脚本构建阶段。