为什么要将Swift Package编译成XCframework?
这是一个困扰我很久的问题,问题产生的背景是多个Swift Package Manager
创建的独立package
,希望组合成一个SDK,这些package
有些是第三方的,比如Alamofire、SwiftyJSON
,也有自己写的package
,自己写的package
是依赖第三方package
,现在想把自己写的package
打包成XCFramework
提供给别人使用,如何在不改动依赖情况下,将自己写的package
和第三方的package
都打包成XCframework
?
简单理解一下需求,就是需要将SPM Package
及其依赖的第三方SPM Package
打包成XCFramework
提供给别人使用。
有哪些解决方案?
方案1: swift-create-xcframework
swift-create-xcframework
是github
上一个包装xcodebuild
命令的命令行项目,通过这个命令行项目,你可以将自己写的SPM Package
及其依赖的第三方SPM Package
都打包成XCFramework
。项目地址
方案1示例
第一步:新建Package
,然后编写Package.swift
,设置第三方依赖
第二步:编写Package
中的代码
编写代码,引用图片资源
第三步:在Package
根目录,安装swift-create-xcframework
1 | $ cd MyLibrary |
第四步:查询Package
中的Target
1 | $ swift create-xcframework --list-products |
第五步:编译打包Package
中的全部target
,多个target
以空格分开
1 | $ swift create-xcframework MyLibrary Alamofire |
编译完成的截图
第六步:编译完成后会在Package
根目录生成对应target
的XCFramework
文件
第七步:编写Demo测试生成后的XCFramework
文件
编写代码测试xcframework
注意:swift-create-xcframework
不是万能的,虽然它可以把自己写的SPM Package和Package依赖的第三方包都打包成XCFramework,但是如果自己的包和第三方的包里面引用了图片等资源,这些资源是不会打包进XCFramework的!!所以需要图片资源的可以继续看方案2。
方案2:自己编写脚本
第一步:编写打包脚本
1 |
|
第二步:保存编译脚本,并放到Package根目录中,给脚本加上可执行权限,然后打包
1 | $ chmod +x build.sh |
编译打包截图:
编译打包成功截图:
最终生成的XCFramework
包含资源文件
注意:自己写脚本打包虽然可以将资源文件打包进XCFramework,但是资源文件被放在了一个单独的Bundle里面,与Xcode生成的XCFramework还是不太一样。并且,脚本无法将依赖的库也打包成XCFramework,所以具体采用哪一个方案还要结合自己的情况选择。目前看来两种解决方案都有缺陷,造成这种缺陷的原因是,Xcode目前没有支持将SPM Package打包成XCFramework的功能,所以才有这么多偏方,如果哪天Xcode支持了这个功能,那这两个方法都可以被抛弃了。
案例Demo
参考链接
swift-create-xcframework(已不再维护)
How to build Swift Package as XCFramework