9

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

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

4

4 回答 4

7

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

于 2018-04-26T14:31:31.293 回答
3

可能最简单的解决方案是将运行脚本阶段添加到另一个项目,该项目定义了一个执行脚本的命令行,该脚本作为特定文件驻留在某个已知位置。

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

于 2013-10-10T17:32:14.853 回答
2

我的解决方案需要一点红宝石知识。有一个名为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 中将“=”替换为“==”,否则第一个脚本将被替换,我们需要追加

于 2020-04-22T09:32:17.617 回答
1

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

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

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

于 2013-10-14T22:10:26.227 回答