在Xcode创建应用程序二进制文件后,删除框架和框架链接

在Xcode创建应用程序二进制文件后,删除框架和框架链接,xcode,otool,Xcode,Otool,我想在Xcode中构建同一应用程序的两个版本,一个有,一个没有Sparkle框架。我不想维持一个单独的目标。相反,我想使用两个独立的方案,它们依赖于两个独立的构建配置(好吧,总共4个,因为我将使用一个用于调试构建,一个用于发布构建) 问题是“复制捆绑资源”和“构建阶段”中的“链接二进制”步骤对于给定目标上的所有方案都是相同的,据我所知 因此,在我看来,我唯一的选择是在构建之后(以及在签名之前)运行一个脚本,该脚本将: 从应用程序包中删除框架 取消框架与可执行文件的链接(见ottol-L) 有什么

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

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

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

  • 从应用程序包中删除框架
  • 取消框架与可执行文件的链接(见
    ottol-L

  • 有什么建议吗?

    经过一番努力,我想出了一个解决办法

  • 首先,确保框架链接是“弱”的,Xcode在“链接二进制”阶段将其称为“可选”。还要确保在代码中使用Sparkle可以处理缺少的Sparkle框架
  • 通过转到“配置”选项卡中“信息”下的“项目设置”,为调试和发布创建单独的生成配置,例如称为“调试-无火花”和“发布-无火花”。通过进入“Schemes”(方案)弹出菜单,复制正常方案,然后在方案的各种操作中使用“no_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\u name\u tool
    完全删除与框架链接对应的行。我只能将其更改为“/”以删除它的任何痕迹,这样即使框架以某种方式可访问,它也不会意外加载。如果能够完全删除它就好了。

    对于Xcode 9,有一个更简单的解决方案,不涉及脚本。看看我原来的答案:听起来很棒!你能在这里回答我的具体问题吗?我不确定“排除源代码”将如何与框架一起工作,并阻止构建的“复制”阶段。谢谢