2020-02-06
添加Swift 5.1开始, ABI稳定特性打包兼容说明
(Carthage暂不考虑..., 略过)
简(fei)介(hua)
随着越来越多方便的第三方组件, 现在开发App基本十多个第三方依赖以上. 没有build cache或者打正式包的时候, 每次基本耗时10分钟以上.
主要原因是需要编译大量源文件(大概分为app和Cocoapods依赖库), 所以把可抽离代码编译好, 再去引用就能减少源文件编译时间
至于有没有其它更高级玩法, 暂时还不太清楚
想法(来自网络各种方法综合)
简单的平民解决方法: 建立私有二进制的repo
app
- 抽离封装为一个库, 打包为二进制, 存到私有
Cocoapods repo
- 抽离封装为一个库, 打包为二进制, 存到私有
Cocoapods依赖
- 每个组件版本的源码打包为二进制, 存到私有
Cocoapods repo
- 每个组件版本的源码打包为二进制, 存到私有
如果公司或者你有足够资源, 可以弄双私有源(两个私有repo, 一个二进制, 一个源码), 不然就简单点, 弄个私有二进制的repo也够用
思路
由于没机器和资源, 只实践了后面的简(diao)单(si)版. 有条件最好是做一套自动化的, 我是没机器和资源, 打包还是各种脚本在自己机器上手动打包, 好惨...
简单版思路:
打包第三方源码
- 每个tag打包二进制(只弄了打包
framework, 不知道别人的static framework如何制作, 试了不成功)
- 每个tag打包二进制(只弄了打包
私有repo
- 其实就是一个
git仓库, 私有属性即可(虽然公有也行, 只是别人能看), 一般github,gitlab,gitee或者自建git创建一个仓库就可以了
- 其实就是一个
二进制文件存放
- 打包出来的二进制文件, 需要找个地方提供下载, 有条件的话可以存CDN管理, 没的话在内网放个静态文件服务器存也行, 还有可以存
git(需要有http(s)下载地址)...
- 打包出来的二进制文件, 需要找个地方提供下载, 有条件的话可以存CDN管理, 没的话在内网放个静态文件服务器存也行, 还有可以存
实践
需要的一些辅助工具
步骤
打包第三方源码
git clone各种组件源码库脚本打包
tag拉分支, 并切换(打包之后删除, 再回去master)- 使用
pod gen根据podsec创建工程 xcodebuild打包framework(真机和模拟器)- 合并真机和模拟器的
framework - 看上去是这么简单, 实践的时候会发现有些库是不能通用一个脚本的
- 上传
framework(用了binary-server管理)
二进制的
podsec上传到私有的repo使用
pod bin spec create创建二进制版本的podsec- 有
subsec的会要求提供template - 某些平台要求版本会低于8, 因为是使用
framework, 需要平台版本需要改为8以上
- 有
- 上传生成的
podsec
使用
- 在
Podfile加上source {你的私有repo}, 然后再加一个官方的repo(例如:source 'https://cdn.cocoapods.org/'). - 官方的一定要加在后面, 有相同的库会根据
source的顺序获取依赖. 想切回源码注释私有库那一行就好了(因为只是简单的一个私有二进制repo)
- 在
某些坑
- 不知道会有啥影响,
AppStore的打包还是老老实实的用源码build modulemap记得要把真机和模拟器的合一起- 真机和模拟器的
DSYM文件保留(万一哪一天用上) - 有些第三方库是
*.podsec, 有些是*.podsec.json pod bin spec create创建的二进制podsec文件名是带加了binary, 需要去除, 不然和podsec的name和文件名对不上, 无法通过pod spec lintpod repo push上传私有spec的时候, 记得加--use-json --allow-warnings- 或许还有其它...
其它
Swift 5.1开始, ABI已稳定, 可打包兼容多个不同swift版本打包可相互使用, 不需要重新打包
framework- 开启地方位于项目的
build setting-Build Option-Build Libraries for Distribution改为YES framework的Modules里面会多生成一个类似源码的interface文件相关资料
- 开启地方位于项目的