一、Carthage介绍
Carthage是GitHub上开源的、用于Cocoa开发的三方依赖管理工具。GitHub地址:https://github.com/Carthage/Carthage
通过Carthage,我们在iOS项目的开发中可以很方便的对三方依赖进行配置管理。
Carthage的原理,简而言之,是通过配置文件Cartfile指定所依赖的三方框架,Carthage通过分析配置文件的内容,通过从github、git仓库或二进制包URL获取依赖,生成为同时包含模拟器和真机目标代码的.framework库。
二、Carthage与CocoaPods比较
2.1 去中心化管理工具:Carthage
- Carthage用swift开发,支持iOS8以上系统。通过生成framework供项目依赖。
- 轻量级。
- 使用简单。
- 三方依赖灵活自由。
2.2 集中式管理工具:CocoaPods
介绍略
2.3 侵入程度
- Carthage非侵入式
- CocoaPods会修改Xcode中的workspace配置,而Carthage不会,对工程配置没有侵入性。
三、Carthage使用
3.1 安装Carthage
终端执行:brew install carthage
即可
注意:终端安装,Mac需要先安装homebrew,homebrew的安装可以见我的另一篇博文:新mac安装CocoaPods完整流程
3.2 指定依赖
通过Cartfile文件指定三方依赖
-
指定代码仓库,以GitHub为例
git “https://github.com/liangzhen6/LZImageBrowser” ~> “master” -
指定二进制包地址
binary “https://xxxxxxxxxxx/test.json”
而test.json的内容为:
{
“2.3”: “https://xxxxxxxxxxx/test.framework.zip”,
“3.0.3”: “https://xxxxxxxxxxx/test.framework.zip”
}
有2个不同版本的test.framework可供使用,可指定使用版本。
注意:Carthage要求通过URL配置二进制包,必须使用HTTPS协议。
3.3 把代码编译成framework
命令:
carthage build --no-skip-current
carthage archive YourFrameworkName
或
carthage build --archive
3.4 生成依赖包
- 运行carthage update命令生成依赖包
- 编辑完成Cartfile后,在该目录下运行:
carthage update --platform iOS
platform iOS指定iOS平台,不指定则生成匹配所有平台的依赖包。 - Carthage会根据指定的配置,在代码仓库或二进制包仓库中查找符合语义版本的最高版本,进行编译生成或下载二进制包,到子目录:Carthage/Build/iOS。同时,Carthage会生成Cartfile.resolved,用于保存经过检查和判断后所明确下来的包的版本。
3.5 集成代码
- 将Carthage/Build/iOS目录下生成的.framework文件,添加到project工程配置中即可。
- 为application添加运行脚本,裁剪framework中不必要的目标代码。由于Carthage帮我们生成的framework同时包含了模拟器和真机的目标代码,所以如果我们开发的是framework,那么只需要能够指定依赖并成功通过编译链接即可,但如果我们生成的最终目标是app,那么在打包的时候,我们需要把所依赖的framework中的不同目标代码裁剪掉。换句话说,如果我们编译的是真机版本,在打包的时候需要把所有依赖的framework中的模拟器目标代码才剪掉,否则将导致App Store审核被拒。
- Carthage提供了命令copy-frameworks,帮助我们简化这个步骤。我们只需要在app的Build Phases中,添加一个Run Script步骤,指定运行命令:
/usr/local/bin/carthage copy-frameworks
- 并且在Input Files和Output Files中指定需要处理的framework即可。具体方法参考:git地址
如何通过Carthage共享自己工程的编译规则
- Carthage只会编译.xcodeproj中指定为shared的规则(scheme)。通过Xcode中的Manage Schemes…查看是否共享了sheme:
可以通过carthage build --no-skip-current
命令验证是否正确的共享了scheme。
Carthage对于多层依赖管理的处理方式
如果一个依赖包依赖了另外一个依赖包,Carthage只需要集成顶层的依赖包到carlift文件中,Carthage会迭代解析下载所有的依赖包。