前言
很多ios开发者大概对CocoaPods并不陌生,我们几乎已经习惯了在pod文件中添加一行即可将一个库导入到自己的工程中,不得不说,在ios开发的历史中CocoaPods功不可没,即便在未来它也会在开发者中占据半壁江山。但是在这里我向大家介绍一个新的第三方库管理工具-Carthage,不管你是菜鸟还是老鸟,都希望这篇文章能为你打开一个新的世界。
很多人会问了,自己用CocoaPods意境习惯了,并没有发现什么不妥,为什么要使用carthage呢? 所以为了解开大家的疑问,我会首先介绍这两个第三方库管理工具的不同,让大家对这颗刚刚崛起的新星有一个初步的了解。
说到Carthage,就要先说swift,2014年苹果发布swift初期,用swift编写的第三方库就只能通过拖动源代码到自己的项目中才能被调用, 由于当时只有寥寥无几的开源库,且不能打包,加上swift1.0并不是那么好用,许多人对swift持着观望的态度。随着swift逐步趋于稳定,并且从ios8.0开始支持将自己写的swift打包成framework,越来越多的纯swift编写框架开始出现,就在这时候carthage突然出现在人们的视野中,而且陆陆续续几乎所有的开源框架都开始支持carthage。
Carthage的github主页为 https://github.com/Carthage/Carthage.git 里面其实对大家的疑问都有着详尽的解答,介于一些朋友英文不太好,这里我就用中文介绍一下Carthage和CocoaPods的不同:
首先,CocoaPods会直接创建和修改项目的workspace配置,一切都是为了便捷,我们只需要修改pod文件并不需要过多的关心其他事情,CocoaPods创建的是高度集成的项目。 而Carthage的特点是灵活,耦合度不高,集成时不需要集成相应的project,不需要创建workspace,而仅仅需要依赖打包好的framework文件即可。
其次,CocoaPods相对来说功能要比Carthage多很多,在国内由于墙的原因,我们都改成了淘宝的源来更新CocoaPods,相信我,如果你不翻墙,很多东西还是不能用,更新不下来,版本错误等一系列原因会让你不得不放弃一些看起来非常好用的第三方库。而Carthage似乎只需要从github上下载项目即可,配置更是简单,使用的时候项目干干净净,所有的第三方库就像苹果原生的framework一样美好,从此你不再需要担新CocoaPods的库用不了,不用花大量时间去修复用CocoaPods打包时出现的各种问题,如果你用过CocoaPods,当你开始用Carthage的时候,你会爱上这个工具的
优点
- Carthage 是去中心化的依赖管理工具,安装依赖时不需要去中心仓库获取 CocoaPods 所有依赖的索引,节省时间
- 对项目无侵入性,Carthage 设计上也比较简单,利用的都是 Xcode 自身的功能,开发者在创建依赖时,相比 CocoaPods 也简单许多
- Carthage 管理的依赖只需编译一次,项目干净编译时,不会再去重新编译依赖,节省时间,大大增加了Achive和Build的时间
- 是由Swift语言编写的,自动将第三方框架编程为 Dynamic framework( 动态库 )
- 与 CocoaPods 无缝集成,一个项目能同时拥有 CocoaPods 和 Carthage
缺点
- 仅支持 iOS8 +
- 它只支持Framework,所以不能用来针对 iOS 8 以前的系统版本进行开发
- 支持的 Carthage 安装的第三方框架和依赖不如 CocoaPods 丰富
- 无法在 Xcode 里定位到源码,只可以看到一个库的头文件
- 安装包的大小比用CocoaPods安装的包大
- 每次update时,需要从git仓库中重新拉取下载,比较耗时
- 每次更新环境都需要连接到中心仓库,比较耗时
- 每次编译都会把所有第三方库都重新编译一次
- 繁琐的维护过程
安装使用Carthage
一 安装
1.1 brew安装
- brew update
- brew install carthage
1.2 下载安装
如果你不喜欢使用终端,也可以从网站https://github.com/Carthage/Carthage/releases下载最新版的Carthage.pkg来更新。
当你安装好Carthage后,在终端执行
- carthage version
即可看到当前的carthage版本, 当我写这篇文章的时候,Carthage的版本为0.38.0 。
二 使用
现在,你已经安装好了Carthage,接下来就是在你的项目中使用carthage了
1 通过终端进入到项目所在的文件夹
- cd ~/Path/Project
路径换成自己项目的路径
2 创建一个空的carthage文件
- touch Cartfile
3 使用Xcode打开 或者使用文本编辑打开
- open -a Xcode Cartfile
4 在Cartfile文件中添加需要添加的第三方库
版本的含义
~> 3.0 表示使用版本3.0以上但是低于4.0的最新版本,如3.5, 3.9
== 3.0 表示使用3.0版本
>= 3.0表示使用3.0或更高的版本
如果你没有指明版本号,则会自动使用最新的版
5 保存并关闭Cartfile文件,在终端执行命令 这一步可能需要很长时间
carthage update --platform iOS --use-xcframeworks 或者
carthage update snapKit --platform iOS --use-xcframeworks
说明
1、carthage会clone/fetch文件中对应的git第三方库,把每一个第三方库编译成二进制文件的framework文件。
2、--platform iOS命令是可选的,目前每次更新时建议加上,作用是保证只为iOS编译framework,如果不指定平台,会为全平台编译framework文件。--use-xcframeworks 是Xcode12后真机和模拟器分开后需要添加的。
3、当命令执行完毕,在Cartfile文件同级别的文件夹中生成一个名为“Carthage”文件夹和“Cartfile.resolved”文件。打开Carthage文件夹,可以看到两个文件夹Build和Checkouts。
4、Cartfile.resolved 文件用来跟踪项目当前所用的依赖版本号,为了保持多端开发一致。建议纳入git版本管理中,切记不要忽略。
三 项目中配置
1,指定frameworks的路径 Build setting ->Framework Search Paths 添加
$(PROJECT_DIR)/Carthage/Build/iOS
2 添加一个新的 “Run Script” Build Phases -> ➕ ->New Run Script Phase
配置新的脚本
/usr/local/bin/Carthage copy-frameworks
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
...
此时,你已经可以使用导入的第三方库了
如需要使用Alamofire和SwiftyJSON,就在相应的类前添加 使用
import Alamofire
import SwiftyJSON