1

我想在 Xcode 中构建同一个应用程序的 2 个版本,一个有 Sparkle 框架,一个没有 Sparkle 框架。我不想维护一个单独的目标。相反,我想使用 2 个独立的方案,它们依赖于 2 个独立的构建配置(嗯,总共 4 个,因为我将使用一个用于调试构建,一个用于发布构建)。

据我所知,问题在于“构建阶段”中的“复制捆绑资源”和“链接二进制”步骤对于给定目标上的所有方案都是相同的。

因此,我看到的唯一选择是在构建之后(和签名之前)运行一个脚本,该脚本将:

  1. 从应用程序包中删除框架。
  2. 取消框架与可执行文件的链接(如 列出的ottol -L)。

有什么建议么?

4

1 回答 1

3

经过相当多的工作,我想出了一个解决方案。

  1. 首先,确保框架链接是“弱”的,Xcode 在“链接二进制”阶段将其称为“可选”。还要确保在您的代码中使用 Sparkle 处理缺少的 Sparkle 框架。

框架的可选链接

  1. 通过转到“配置”选项卡中的“信息”下的项目设置,为调试和发布创建单独的构建配置,例如称为“Debug-no_sparkle”和“Release-no_sparkle”。还可以通过转到“方案”弹出菜单,复制您的正常方案,然后在方案的各种操作中使用“no_sparkle”配置来创建相应的方案。

  2. 将“运行脚本”步骤添加到目标设置中的构建阶段。

运行脚本阶段以删除 Sparkle 框架

这是我使用的 Ruby 脚本:

config = ENV['CONFIGURATION']
if (config =~ /no_sparkle/)

    $stderr.puts "Removing Sparkle Framework"
    sparkle_path = "#{ENV['BUILT_PRODUCTS_DIR']}/#{ENV['FRAMEWORKS_FOLDER_PATH']}/Sparkle.framework"
    `rm -Rf "#{sparkle_path}"`

    $stderr.puts "Removing Sparkle Framework linking"
    binary_path = "#{ENV['BUILT_PRODUCTS_DIR']}/#{ENV['EXECUTABLE_PATH']}"
    `install_name_tool -change @rpath/Sparkle.framework/Versions/A/Sparkle @rpath/ "#{binary_path}"`
end

我不能做的一件事是完全删除与框架链接对应的行install_name_tool。我只能将其更改为“/”以删除它的任何痕迹,因此如果框架可以以某种方式访问​​,它甚至不会意外加载。能够完全删除它会很好。

于 2016-09-30T10:02:02.210 回答