我正在努力为我的二进制Swift框架启用模块稳定性。
我的设置如下:
- Xcode 11.1
- 已启用"为分发构建库"选项
我已经验证了输出的.framework确实在框架中包含了必要的.swiftinterface文件,所以理论上我认为它应该有效。
然而,当我尝试从任何应用程序使用此框架时,dyld
在与__abort_with_payload
一起启动时崩溃。
我在以下情况下尝试过:
- 由Xcode编译的原始框架(.framework格式(
lipo
d胖框架(.framework格式(- 新XCFramework(.XCFramework(格式
在我测试过的所有情况下,启用此选项似乎会导致应用程序在启动时崩溃。
唯一想到的是,我的框架是一个我的框架本身依赖于其他第三方(非二进制(框架,这些框架是通过Cocoapods编译的。
在WWDC’19关于二进制框架的演讲中,我们被告知"您的所有依赖项都必须使用Build Libraries for Distribution构建设置来构建,以便获得我们所谈到的二进制兼容性保证"——然而,这并不能明确是否可以仅构建具有模块稳定性的二进制框架本身,并从源代码构建依赖关系。
我还尝试在Pods子项目构建设置中启用"构建用于分发的库",但这仍然不能解决问题。
有什么建议吗?
我已经想出了如何解决这个问题。
正如WWDC谈话中所建议的(但不是非常清楚(,似乎所有库依赖项都必须启用"Build Libraries for Distribution"构建设置。
椰子
Cocoapods目前没有内置的对此的支持(或者XCFrameworks(,但是,可以通过在应用程序的Podfile中添加以下内容来暂时破解:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end
这将确保所有依赖项都是为分发而构建的。
迦太基
迦太基也不支持模块稳定性。您需要传递自定义的Xcode构建设置,以确保在运行carthage build
时,您的框架是在启用"为分发构建库"的情况下构建的:
echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES'>/tmp/config.xcconfig; XCODE_XCCONFIG_FILE=/tmp/config.xcconfig carthage build; rm /tmp/config.xcconfig