如何通过Swift Package Manager创建闭源库并隐藏代码?
使用Swift Package Manager创建闭源库的方法
当然可以用SPM来搭建闭源库!很多教程默认聚焦开源场景,但SPM其实早就支持预编译二进制包的方式,完美适配你需要隐藏源码的需求——毕竟总有一些核心代码不方便公开嘛。
下面是具体的实现步骤:
1. 先把你的库编译成二进制框架
首先你需要把闭源的代码编译成对应平台的二进制框架(.framework 或 .xcframework),这里有两种常用方式:
方式一:用swift build命令编译
针对macOS、Linux这类平台,直接在终端执行:
swift build --configuration release
如果需要生成支持多架构的通用二进制(比如同时支持arm64和x86_64的macOS包),可以加架构参数:
swift build --configuration release --arch arm64 --arch x86_64
编译后的二进制文件会放在 .build/release 目录下。
方式二:用xcodebuild编译iOS/watchOS等Apple平台框架
如果你的库要支持iOS、iPadOS这类需要签名的平台,更适合用xcodebuild生成.xcframework(跨平台通用框架),示例命令:
xcodebuild archive -scheme YourLibraryName -destination "generic/platform=iOS" -archivePath ./ios-arm64.xcarchive SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES xcodebuild archive -scheme YourLibraryName -destination "generic/platform=iOS Simulator" -archivePath ./ios-x86_64.xcarchive SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES xcodebuild -create-xcframework -framework ./ios-arm64.xcarchive/Products/Library/Frameworks/YourLibraryName.framework -framework ./ios-x86_64.xcarchive/Products/Library/Frameworks/YourLibraryName.framework -output YourLibraryName.xcframework
执行完就能得到一个包含真机和模拟器架构的.xcframework文件。
2. 在SPM的Package.swift中引用二进制目标
接下来修改你的Package.swift文件,用binaryTarget来替代原来的target(源码目标),示例配置如下:
本地引用二进制包(适合自己测试或内部团队使用)
// swift-tools-version: 5.8 import PackageDescription let package = Package( name: "YourClosedSourceLibrary", platforms: [ .iOS(.v15), .macOS(.v12) ], products: [ .library( name: "YourClosedSourceLibrary", targets: ["YourClosedSourceLibrary"] ) ], targets: [ .binaryTarget( name: "YourClosedSourceLibrary", path: "./YourLibraryName.xcframework" // 这里填你的二进制框架路径 ) ] )
远程引用二进制包(适合分发给外部开发者)
如果要把闭源库作为远程包提供给别人,你需要把二进制框架上传到服务器,然后在Package.swift中配置url和checksum:
.binaryTarget( name: "YourClosedSourceLibrary", url: "https://your-server.com/path/to/YourLibraryName.xcframework.zip", checksum: "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890" )
获取checksum的方法:把二进制框架打包成zip后,执行swift package compute-checksum ./YourLibraryName.xcframework.zip就能得到对应的校验值。
3. 额外注意事项
- 确保二进制框架的架构和你声明的
platforms完全匹配,否则其他开发者引入时会出现编译错误。 - 如果你的闭源库依赖其他开源包,记得在
Package.swift的dependencies中声明这些依赖,SPM会自动处理依赖关系。 - 对于需要代码签名的平台(比如iOS),编译二进制框架时要加上
BUILD_LIBRARY_FOR_DISTRIBUTION=YES,这样才能保证其他项目引入后正常使用。
内容的提问来源于stack exchange,提问作者Sirop4ik




