xcode - 如何从 macOS 应用程序包中排除标准但未使用的 libswift*.dylib 并减小包大小
问题描述
当我使用 Xcode 9 构建用 Swift 4 编写的简单菜单栏可可应用程序时,许多 libswift*.dylib 库被链接/下载/嵌入到 .app 包中,进入 Frameworks 文件夹,如下所示:
我只在我的项目中使用import Cocoa
andimport Foundation
和一些 @objc 函数作为定时器函数的选择器。我真的不认为我非常简单的菜单栏应用程序需要一些 3D 渲染 Metal 库函数或任何 SwiftOnoneSupport,所以我希望将它们从 .app bundle 中删除。(相同的库也包含在帮助应用程序中以在登录功能时启动,这使得帮助应用程序甚至超过 10 MB)
我原以为 Xcode 实际上只会复制默认情况下需要的任何内容。这里和这里都提出了一些类似的问题,但我认为这两个问题都没有令人满意的最新答案。
到目前为止我尝试过的
我设置ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
在NO
. Build Settings
它似乎没有任何效果。
我设置LINK_WITH_STANDARD_LIBRARIES
在NO
. Build Settings
即使我尝试在链接框架和库部分下自行添加一些框架(Cocoa、Foundation),它也破坏了一切并且无法构建它。
解决方案
简而言之,不可能排除 Swift 自动包含在应用程序中的标准库并期望它能够工作。目前,任何使用 Swift 创建的应用程序都捆绑了自己的 Swift 动态库版本。Swift 并不存在于操作系统上,而是存在于每个应用程序包中。这意味着任何使用 Swift 4.1 的应用程序,例如 Swift 4.1 动态库(包含 4.1 ABI)中的捆绑包,等等。
Swift 项目路线图上的一件事是最终拥有ABI 稳定性。如果 Swift 成为 ABI Stable,Swift 将存在于操作系统中,并且它的 ABI 将与 Swift 的每个版本兼容。
推荐阅读
- oracle - 打开文件时目录路径无效
- javascript - 如何在 react--modal-video 中显示不同的链接?
- r - 基于另一个没有长数据的数据框创建 NA
- javascript - 当不喜欢记录我的nodejs时,无法在将标头发送到客户端后设置标头
- r - boot.ci 错误,由于数据变化太小?
- c# - MonogDB C# 驱动程序 LINQ 查询在按 _id 过滤时不起作用
- sql-server - SSRS 删除的报告奇迹般地回来了
- android - 如何将 android TextToSpeech.getAvailableLanguages() 转换为字符串 []
- python - Python 脚本以交互方式工作,但在从 shell 调用时不能
- c# - C#表单加载元素后自动加载问题