一、背景:
-
公司的项目使用Carthage做依赖管理,相比于Cocopods,Carthage更适合多人开发的场景,这样就不会因为一个人对依赖的修改而影响所有的人。
-
公司项目使用
S3服务器
对build好的依赖
进行缓存,要用的时候用fastlane carthage_install
将缓存下载到项目中的Carthage文件中
就能直接跑程序。不用每次都到各个依赖库的仓库进行clone,然后再build,因为那样相当耗时。如果后续对依赖进行升级或者修改,只需要把build好的依赖上传到S3服务器即可。
二、任务介绍:
-
近来在做一项任务,就是升级Branch SDK到最新版本,因为Branch SDK是被嵌入到Segment-Branch-iOS中使用的,所以在
Cartfile
中并没有单独的Branch SDK,不可以直接去升级Branch SDK。只能通过升级Segment-Branch-iOS这个SDK,间接升级Branch SDK。 -
那问题就清楚了,我直接升级Segment-Branch-iOS不就完事了?后面得知Segment-Branch-iOS是个私人库,有位同事将这个私人库接入到公司的项目中,所以必须要先升级私人库里面的Branch SDK。
三、实际操作与思考:
-
大方向找准以后,先Forked那位同事的私人库到自己的github里试试先。Forked过来以后,因为Segment-Branch-iOS也是用Carthage来做依赖管理,不过没有使用S3做服务器缓存了。
所以为了升级Segment-Branch-iOS里面的Branch SDK,直接在命令行执行:
carthage update --platform ios --use-xcframeworks ios-branch-deep-linking
- 如果跑
carthage update
,就会直接对Cartfile
中的库进行升级,会升到最高级的。 - 如果想限制版本,则可以去
Cartfile.resolved
文件中设置版本号,然后再使用carthage bootstrap
,就能限制版本号了(或者不修改Cartfile.resolved
文件,直接在Cartfile
文件中写上版本号去carthage update)。 --platform ios
是为了指定使用的是iOS平台,就不会去拉取tv、watch等系统的库。--use-xcframeworks
指明需要生成.xcframeworks
类型的库。否则就会生成.frameworks
的库。
- 如果跑
-
运行以后,Build文件夹里出现Branch.xcframework,且Cartfile.resolved文件里的版本记录也改变了,说明升级成功了。
-
将此改动Push到Forked出来的Segment-Branch-iOS,会得到个新的commit id,此时copy这个commit id去修改主项目中的Cartfile,让依赖指向这个已经更新好的私人库。
-
在主项目中运行
carthage update --platform ios --use-xcframeworks Segment-Branch-iOS
,发现竟然出现了循环链? -
Google了一下,要解决这问题,只能删除Carthage/Build和Carthage/Checkouts文件,不使用S3服务器的依赖缓存,从头到尾clone和Build所有的库。于是执行:
scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds
- 这里没使用
carthage update
而是用了scripts/carthage-build.sh update
原因是某些库在iOS 12上有问题,所以需要自己写特殊的carthage脚本来执行操作。(可以理解为使用加工过的carthage update即可) --cache-builds
是为了重新执行命令的时候,让已经build好的库不再重新build,节省时间。
发现出错了,打开报错日志,可以看到在某路径下,缺失了某些xcframework的库:
将S3缓存的
Mixpanel.xcframework
和Segment.xcframework
复制粘贴到该路径下:/Users/wwan/Desktop/TKPlanner-iOS/Carthage/Checkouts/analytics-ios-integration-mixpanel/Carthage/Build/ - 这里没使用
-
再次执行:
scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds
依然出错了,打开报错日志,可以看到在某路径下,缺失了
XCUIElement+Extensions/swifit
:将S3缓存的XCUIElement+Extensions.swift复制粘贴到该路径下:/Users/wwan/Desktop/TKPlanner-iOS/Carthage/Checkouts/UITestUtilities-iOS/Sources/
-
再次执行:
scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds
依然再次出错,打开报错日志发现这回难搞了,这
-lswiftXCTest
不知道是个什么库,被缺失了,Google也找不到什么答案。只知道是UITestUtilities-iOS
这个库缺东西了: -
查看
UITestUtilities-iOS
的github的仓库,发现该库最新版本是0.1.4,而主项目中的Cartfile
里面用着该库0.1.2的版本,再看看0.1.3的更改记录,lswiftXCTest
已经被修改成了lXCTestSwiftSupport
: -
说明
lswiftXCTest
已经被换掉了。于是将主项目Carfile文件中的UITestUtilities-iOS版本改成0.1.3,执行:scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds
,最终成功成功从各个依赖库clone和build出了所有的依赖!