在Xcode

时间:2016-09-30 10:02:02

标签: xcode otool

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

问题在于'复制捆绑资源'和“Link Binary”#39; '构建阶段'中的步骤对于给定目标上的所有方案都是一样的,据我所知。

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

  1. 从应用包中删除框架。
  2. 取消框架与可执行文件的链接(与ottol -L一起列出)。
  3. 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 首先,确保框架链接是"弱",Xcode调用"可选"在'链接二进制文件'相。还要确保在代码中使用Sparkle处理缺少的Sparkle框架。
  2. Optional linking of framework

    1. 为Debug和Release创建单独的构建配置,例如叫做'Debug-no_sparkle'和'发布 - no_sparkle',通过转到项目设置,在'信息'在'配置'标签。还可以通过“方案”创建相应的方案。弹出菜单,复制您的正常方案,然后使用' no_sparkle'该计划的各种行动中的配置。

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

    3. Run script phase to remove Sparkle framework

      这是我使用的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完全删除与框架链接相对应的行。我只能把它改成' /'删除它的任何痕迹,所以如果框架以某种方式可访问它甚至不会意外加载。能够完全删除它会很好。