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

pjngdqdw  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(169)

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

6jygbczu

6jygbczu1#

经过一番努力,我想出了一个解决办法。
1.首先,确保框架链接是“弱”的,Xcode在“链接二进制”阶段称之为“可选”。还要确保在代码中使用Sparkle处理缺少的Sparkle框架。

1.通过转到“Configuration”选项卡中“Info”下的“Project settings”,为Debug和Release创建单独的构建配置,例如称为“Debug-no_sparkle”和“Release-no_sparkle”。还可以通过转到“Schemes”弹出菜单,复制您的正常方案,然后在方案的各种操作中使用“no_sparkle”配置来创建相应的方案。
1.在目标设置的构建阶段中添加“运行脚本”步骤。

下面是我使用的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的行。我只能将其更改为'/'以删除任何痕迹,因此如果框架可以以某种方式访问,它甚至不会意外加载。如果能够完全删除它,那就太好了。

bbuxkriu

bbuxkriu2#

您可以通过EXCLUDED_SOURCE_FILE_NAMES键(也可以从Build Settings选项卡访问)从特定构建中删除文件/框架。
与脚本相比,更喜欢这个脚本,因为它可能会导致一些启动崩溃和/或Apple关于丢失库的警告。

相关问题