【问题标题】:Remove a framework and the link to the framework after the app binary is created by Xcode在 Xcode 创建应用程序二进制文件后删除框架和框架的链接
【发布时间】:2016-10-01 03:06:20
【问题描述】:

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

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

所以我看到的唯一选择是在构建之后(和签名之前)运行一个脚本:

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

有什么建议吗?

【问题讨论】:

    标签: xcode otool


    【解决方案1】:

    经过一番努力,我想出了一个解决方案。

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

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

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

    这是我使用的 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 的框架链接对应的行。我只能将其更改为“/”以删除它的任何痕迹,因此如果框架可以以某种方式访问​​,它甚至不会意外加载。要是能完全去掉就好了。

    【讨论】:

    • 使用 Xcode 9 有一个不涉及脚本的更简单的解决方案。在这里查看我的原始答案:stackoverflow.com/a/46982763/2272561
    • 听起来不错!你能在这里发布我的具体问题的答案吗?我不确定“排除源”如何与框架一起使用,并阻止构建的“复制”阶段。谢谢!
    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多