xcframework 不包含内部框架
xcframework does not contain internal frameworks
我正在尝试为我正在使用的一些第三方库创建一个 .xcframework
文件。按照 https://appspector.com/blog/xcframeworks 的指示,我
- 创建特定于平台的
framework
文件:
# Archive for device
xcodebuild archive -scheme TestFramework -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
# Archive for simulator
xcodebuild archive -scheme TestFramework -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
至此,我得到了两个带有 .swiftmodule
个文件的框架;一切看起来都不错。这些框架 不 带有 .swiftinterface
文件,但我认为这没问题,因为这些是 objc 项目。那么,我
- 将各个
framework
组合成一个 xcframework
文件:
# Build xcframework with two archives
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/TestFramework.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework -output /tmp/xcf/TestFramework.xcframework
在这里,xcodebuild
不会 失败 ,但它会发出一个奇怪的错误:
No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.
重要的是,.xcframework
包不包含 Info.plist
文件中指定的 framework
个 或 个文件夹。显然,当我在这种状态下尝试 link 到 xcframework
时,我得到了一堆 "missing symbols" linker 错误。
这是为什么?我必须怎么做才能让 xcodebuild
完全创建 xcframework
?
注意:目前手动创建文件夹似乎可行,但这感觉不对而且很脆弱——Apple 可以随时更改 xcodebuild
的工作方式。
事实证明,将 BUILD_LIBRARY_FOR_DISTRIBUTION = YES
添加到 xcodebuild
命令的末尾是不够的/无法生成具有所需 swiftinterface
文件的框架。我必须进入实际项目的设置并手动将 BUILD_LIBRARY_FOR_DISTRIBUTION
设置为 YES
,如 所建议的那样。在我获得带有 swiftinterface
文件的框架后,我就可以毫无问题地使用 xcodebuild
创建 xcframework
文件。
创建 XCFramework
XCFramework 替换了 Fat/Universal 框架。它是一个 bundle
,每个 architecture/platform 包含多个 .framewok。我们不需要使用 lipo
[About] 来手动合并和分离框架
XCFramework 支持 headers 和 Objective-C
的库
为您的框架启用Build Libraries for Distribution(BUILD_LIBRARY_FOR_DISTRIBUTION)
。 XCFramework 仅适用于启用 [BUILD_LIBRARY_FOR_DISTRIBUTION]。如果不是,当你 运行 步骤 3 xcodebuild -create-xcframework
你得到(或没有)
No 'swiftinterface' files found within '<some_path>/<some_name>.xcarchive/Products/Library/Frameworks/<some_name>.framework/Modules/<some_name>.swiftmodule'
Build/archive .framework 不同 architectures/platforms
xcodebuild archive \
-workspace ModuleName.xcworkspace \
-scheme "schemaName" \
-sdk "iphoneos" \
-arch arm64 \
-archivePath "<some_path>/ArchiveName1.xcarchive" \
SKIP_INSTALL=NO \
xcodebuild archive \
-workspace ModuleName.xcworkspace \
-scheme "schemaName" \
-sdk "iphonesimulator" \
-arch x86_64 \
-archivePath "<some_path>/ArchiveName2.xcarchive" \
SKIP_INSTALL=NO \
SKIP_INSTALL
[About] 将框架包含在存档中的关键点之一
使用 xcodebuild -create-xcframework
创建 XCFramework
xcodebuild -create-xcframework \
-framework "<some_path>/ArchiveName1.xcarchive/Products/Library/Frameworks/ModuleName.framework" \
-debug-symbols "<some_path>/ArchiveName1.xcarchive/dSYMs/${schemes[$n]}.ModuleName.dSYM" \
-framework "<some_path>/ArchiveName2.xcarchive/Products/Library/Frameworks/ModuleName.framework"
从 Cocoa 转换为 XCFrameworkpods
对于我的场景,我正在尝试从 cocoapods 生成的 FAT/lipo 框架构建 XCFrameworks。
我将此添加到我的播客文件的末尾:
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
这确保了框架被正确编译,并且我能够 运行 正常的 xcodebuild -create-xcframework ...
命令来生成 XCFramework。
注意:我还使用 cocoapods-binary
插件预构建所有 pods 框架。
我正在尝试为我正在使用的一些第三方库创建一个 .xcframework
文件。按照 https://appspector.com/blog/xcframeworks 的指示,我
- 创建特定于平台的
framework
文件:
# Archive for device
xcodebuild archive -scheme TestFramework -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
# Archive for simulator
xcodebuild archive -scheme TestFramework -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
至此,我得到了两个带有 .swiftmodule
个文件的框架;一切看起来都不错。这些框架 不 带有 .swiftinterface
文件,但我认为这没问题,因为这些是 objc 项目。那么,我
- 将各个
framework
组合成一个xcframework
文件:
# Build xcframework with two archives
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/TestFramework.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework -output /tmp/xcf/TestFramework.xcframework
在这里,xcodebuild
不会 失败 ,但它会发出一个奇怪的错误:
No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.
重要的是,.xcframework
包不包含 Info.plist
文件中指定的 framework
个 或 个文件夹。显然,当我在这种状态下尝试 link 到 xcframework
时,我得到了一堆 "missing symbols" linker 错误。
这是为什么?我必须怎么做才能让 xcodebuild
完全创建 xcframework
?
注意:目前手动创建文件夹似乎可行,但这感觉不对而且很脆弱——Apple 可以随时更改 xcodebuild
的工作方式。
事实证明,将 BUILD_LIBRARY_FOR_DISTRIBUTION = YES
添加到 xcodebuild
命令的末尾是不够的/无法生成具有所需 swiftinterface
文件的框架。我必须进入实际项目的设置并手动将 BUILD_LIBRARY_FOR_DISTRIBUTION
设置为 YES
,如 swiftinterface
文件的框架后,我就可以毫无问题地使用 xcodebuild
创建 xcframework
文件。
创建 XCFramework
XCFramework 替换了 Fat/Universal 框架。它是一个 bundle
,每个 architecture/platform 包含多个 .framewok。我们不需要使用 lipo
[About] 来手动合并和分离框架
XCFramework 支持 headers 和 Objective-C
的库为您的框架启用
Build Libraries for Distribution(BUILD_LIBRARY_FOR_DISTRIBUTION)
。 XCFramework 仅适用于启用 [BUILD_LIBRARY_FOR_DISTRIBUTION]。如果不是,当你 运行 步骤 3xcodebuild -create-xcframework
你得到(或没有)No 'swiftinterface' files found within '<some_path>/<some_name>.xcarchive/Products/Library/Frameworks/<some_name>.framework/Modules/<some_name>.swiftmodule'
Build/archive .framework 不同 architectures/platforms
xcodebuild archive \ -workspace ModuleName.xcworkspace \ -scheme "schemaName" \ -sdk "iphoneos" \ -arch arm64 \ -archivePath "<some_path>/ArchiveName1.xcarchive" \ SKIP_INSTALL=NO \ xcodebuild archive \ -workspace ModuleName.xcworkspace \ -scheme "schemaName" \ -sdk "iphonesimulator" \ -arch x86_64 \ -archivePath "<some_path>/ArchiveName2.xcarchive" \ SKIP_INSTALL=NO \
SKIP_INSTALL
[About] 将框架包含在存档中的关键点之一使用
创建 XCFrameworkxcodebuild -create-xcframework
xcodebuild -create-xcframework \ -framework "<some_path>/ArchiveName1.xcarchive/Products/Library/Frameworks/ModuleName.framework" \ -debug-symbols "<some_path>/ArchiveName1.xcarchive/dSYMs/${schemes[$n]}.ModuleName.dSYM" \ -framework "<some_path>/ArchiveName2.xcarchive/Products/Library/Frameworks/ModuleName.framework"
从 Cocoa 转换为 XCFrameworkpods
对于我的场景,我正在尝试从 cocoapods 生成的 FAT/lipo 框架构建 XCFrameworks。
我将此添加到我的播客文件的末尾:
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
这确保了框架被正确编译,并且我能够 运行 正常的 xcodebuild -create-xcframework ...
命令来生成 XCFramework。
注意:我还使用 cocoapods-binary
插件预构建所有 pods 框架。