解决Carthage疑难问题的思考过程

1,602 阅读4分钟

一、背景:

  1. 公司的项目使用Carthage做依赖管理,相比于Cocopods,Carthage更适合多人开发的场景,这样就不会因为一个人对依赖的修改而影响所有的人。

  2. 公司项目使用S3服务器build好的依赖进行缓存,要用的时候用fastlane carthage_install将缓存下载到项目中的Carthage文件中就能直接跑程序。不用每次都到各个依赖库的仓库进行clone,然后再build,因为那样相当耗时。如果后续对依赖进行升级或者修改,只需要把build好的依赖上传到S3服务器即可。

二、任务介绍:

  1. 近来在做一项任务,就是升级Branch SDK到最新版本,因为Branch SDK是被嵌入到Segment-Branch-iOS中使用的,所以在Cartfile中并没有单独的Branch SDK,不可以直接去升级Branch SDK。只能通过升级Segment-Branch-iOS这个SDK,间接升级Branch SDK。

  2. 那问题就清楚了,我直接升级Segment-Branch-iOS不就完事了?后面得知Segment-Branch-iOS是个私人库,有位同事将这个私人库接入到公司的项目中,所以必须要先升级私人库里面的Branch SDK。

三、实际操作与思考:

  1. 大方向找准以后,先Forked那位同事的私人库到自己的github里试试先。Forked过来以后,因为Segment-Branch-iOS也是用Carthage来做依赖管理,不过没有使用S3做服务器缓存了。

    image.png

    所以为了升级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的库。
  2. 运行以后,Build文件夹里出现Branch.xcframework,且Cartfile.resolved文件里的版本记录也改变了,说明升级成功了。

    image.png

    image.png

  3. 将此改动Push到Forked出来的Segment-Branch-iOS,会得到个新的commit id,此时copy这个commit id去修改主项目中的Cartfile,让依赖指向这个已经更新好的私人库。

    image.png

  4. 在主项目中运行carthage update --platform ios --use-xcframeworks Segment-Branch-iOS,发现竟然出现了循环链?

    image.png

  5. 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,节省时间。

    Pasted Graphic.png

    发现出错了,打开报错日志,可以看到在某路径下,缺失了某些xcframework的库:

    Pasted Graphic 1.png

    将S3缓存的Mixpanel.xcframeworkSegment.xcframework复制粘贴到该路径下:/Users/wwan/Desktop/TKPlanner-iOS/Carthage/Checkouts/analytics-ios-integration-mixpanel/Carthage/Build/

  6. 再次执行:scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds

    Pasted Graphic 3.png

    依然出错了,打开报错日志,可以看到在某路径下,缺失了XCUIElement+Extensions/swifit

    Pasted Graphic 4.png

    将S3缓存的XCUIElement+Extensions.swift复制粘贴到该路径下:/Users/wwan/Desktop/TKPlanner-iOS/Carthage/Checkouts/UITestUtilities-iOS/Sources/

  7. 再次执行:scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds

    Pasted Graphic 5.png

    依然再次出错,打开报错日志发现这回难搞了,这-lswiftXCTest不知道是个什么库,被缺失了,Google也找不到什么答案。只知道是UITestUtilities-iOS这个库缺东西了:

    Pasted Graphic 6.png

  8. 查看UITestUtilities-iOS的github的仓库,发现该库最新版本是0.1.4,而主项目中的Cartfile里面用着该库0.1.2的版本,再看看0.1.3的更改记录,lswiftXCTest已经被修改成了lXCTestSwiftSupport

    Pasted Graphic 7.png

  9. 说明lswiftXCTest已经被换掉了。于是将主项目Carfile文件中的UITestUtilities-iOS版本改成0.1.3,执行:scripts/carthage-build.sh update --platform ios --use-xcframeworks --cache-builds,最终成功成功从各个依赖库clone和build出了所有的依赖!

    image.png

(未完待续...)