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

Liz*_*zza 6 macos xcode build-process ios run-script

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

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

Dav*_*man 6

对于任何寻求简单方法的人,都有一个很棒的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()
Run Code Online (Sandbox Code Playgroud)

现在,只需运行python脚本,您就应该做好了。

  • 我运行脚本并完全搞乱了我的项目 (2认同)

Rei*_*ill 5

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

sudo gem install cocoapods
Run Code Online (Sandbox Code Playgroud)

或者,

gem install xcodeproj
Run Code Online (Sandbox Code Playgroud)

仅安装库。

要创建将运行脚本阶段添加到目标中的 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() 
Run Code Online (Sandbox Code Playgroud)

你可以运行它:

ruby add_run_phase_script.rb
Run Code Online (Sandbox Code Playgroud)

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


Liz*_*zza 2

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

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

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

  • 您何时/使用什么来运行此代码?这是一个快速脚本吗?您介意在这里分享它还是作为“要点”或其他什么? (4认同)