Swift纯库Package归档为空,如何编译为.xcframework?
如何将纯Swift Package编译为Framework/XCFramework
问题原因
- 纯SPM库的归档逻辑与Xcode项目不同,归档产物默认存放在xcarchive的
Products/Library/Frameworks目录下,而非根目录,容易误以为是空归档 - 未正确指定
BUILD_LIBRARY_FOR_DISTRIBUTION=YES参数时,不会生成模块映射(.swiftmodule)等分发必需的文件,仅产出二进制文件 - 未在Package.swift中配置资源目录时,资源不会被打包进framework
解决步骤
1. 确认Package.swift配置正确
确保你的库target为library类型,若包含资源需明确声明:
// Package.swift let package = Package( name: "MyPackage", products: [ .library( name: "MyPackage", targets: ["MyPackage"]), ], targets: [ .target( name: "MyPackage", resources: [ // 根据实际资源类型选择process或copy .process("Resources"), .copy("Assets/Logo.png") ] ), .testTarget( name: "MyPackageTests", dependencies: ["MyPackage"]), ] )
2. 为目标平台单独归档
使用xcodebuild archive命令为每个平台(如iOS设备、iOS模拟器)生成归档,必须指定BUILD_LIBRARY_FOR_DISTRIBUTION=YES和SKIP_INSTALL=NO:
归档iOS设备版本
xcodebuild archive \ -scheme MyPackage \ -destination "generic/platform=iOS" \ -archivePath "./build/ios.xcarchive" \ -sdk iphoneos \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ SKIP_INSTALL=NO
归档iOS模拟器版本
xcodebuild archive \ -scheme MyPackage \ -destination "generic/platform=iOS Simulator" \ -archivePath "./build/iossimulator.xcarchive" \ -sdk iphonesimulator \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES \ SKIP_INSTALL=NO
3. 合并归档为XCFramework
用xcodebuild -create-xcframework将多个平台的framework合并为通用的XCFramework:
xcodebuild -create-xcframework \ -framework "./build/ios.xcarchive/Products/Library/Frameworks/MyPackage.framework" \ -framework "./build/iossimulator.xcarchive/Products/Library/Frameworks/MyPackage.framework" \ -output "./build/MyPackage.xcframework"
4. Xcode GUI方式补充
若使用Xcode GUI归档:
- 直接打开Package.swift文件进入Xcode
- 选择对应的scheme和目标平台,执行归档操作
- 归档完成后,右键对应归档文件 → 显示包内容
- 从
Products/Library/Frameworks目录中提取生成的framework,后续可手动合并为XCFramework
验证结果
生成的XCFramework包含各平台的二进制、模块映射文件及资源,可通过SPM的binaryTarget引入,或直接嵌入到Xcode项目中使用。
内容的提问来源于stack exchange,提问作者Jacob King
相关产品推荐
相关产品推荐

