iOS开发——Carthage:去中心化的Cocoa依赖管理器

如果说 CocoaPods 像一个航母, 一应俱全, 坚实稳固. 那么 Carthage 就像一艘巡洋舰, 机动灵活, 攻击迅速. 1

Why to use Carthage? 2

CocoaPods是已存在很长时间的Cocoa依赖管理器, 那么为什么要创建Carthage呢?
1) CoaoaPods 是一套整体解决方案,我们在 Podfile 中指定好我们需要的第三方库。然后 CocoaPods 就会进行下载,集成,然后修改或者创建我们项目的 workspace 文件,这一系列整体操作。
2) 相比之下,Carthage 就要轻量很多,它也会一个叫做 Cartfile 描述文件,但 Carthage 不会对我们的项目结构进行任何修改,更不多创建 workspace。它只是根据我们描述文件中配置的第三方库,将他们下载到本地,然后用 xcodebuild 构建成 framework 文件。然后由我们自己将这些库集成到项目中。Carthage 使用的是一种非侵入性的哲学。

Carthage 基本的工作流程:
1> 创建一个Cartfile,包含你希望在项目中使用的框架的列表
2> 运行Carthage,将会获取列出的框架并编译它们
3> 将编译完成的.framework二进制文件拖拽到你的Xcode项目当中
Carthage编译你的框架/库,然后提供该框架的二进制文件,但你仍然持有该项目结构和设置的绝对控制。Carthage不会自动的修改你的项目文件或编译设置。

相信大家可能遇到这种情况, Podfile中配置好相关框架/库 -> pod install -verbose -no-repo-update, 然后编译运行时, 出现类似错误:

diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory

接下来又是一系列的折腾, 白白浪费很多时间.

Carthage or CocoaPods? 3

CocoaPods 有如下优势:

① 使用方便, 除编写 Podfile 以外其他几乎都是自动完成;
② 软件包数量多,主流支持;
③ 支持 iOS 8 Framework,当然也支持旧的静态编译.

但是 CocoaPods 作为一个有中心仓库的解决方案,缺点也比较明显:

1⃣️ 每次更新环境都需要连接到中心仓库,比较耗时;
2⃣️ 开发者使用比较简单,但是如果创建兼容 CocoaPods 的库,就会相对繁琐一些(尽管有了命令行);
3⃣️ 每次干净编译都会把所有第三方库都重新编译一次

Carthage 的优势:

① 使用 Carthage 的话,所有的第三方库依赖,除非是更新的需要,不然平常干净编译 Project,它是不需要再次编译的,大大加快平常编译及 Archive 的时间.
② 它是去中心化的,没有中心服务器. 这意味着每次配置和更新环境,只会去更新具体的库,而不会有一个向中心服务器获取最新库的索引这么个过程,如此又省了很多时间.
③ CocoaPods 无缝集成!一个项目可同时使用两套包管理工具, 当前 CocoaPods 管理主要 Framework 的配置下, 将少量其他 Framework 交给了 Carthage 管理, 二者可以和谐地共存.
④ 结构标准的项目天然就是 Carthage 库.

Carthage 的不足:

1⃣️ 库依然不如 CocoaPods 丰富:尽管很多库不需要声明并改造就直接可以被 Carthage 用,但依然有大量 CocoaPods 能用的库不支持,我相信时间能解决这个问题;
2⃣️ 只支持 Framework,所以是 iOS 8 Only了,随着时间推移,这个也不会是问题;
3⃣️ 工具仍不完善:在使用过程中,发现它无法在一个结构复杂的项目中正确发现库(比如有 iOS, Mac demo + framework 的结构);
4⃣️ 无法在 Xcode 里定位到源码:如果你在写代码过程中,想跳转到一个第三方库去看具体的实现,这是无法办到的,Carthage 的配置只能让你看到一个库的头文件

Installing Carthage 开始使用:4

1. 创建一个"Cartfile",将你想要使用的框架列在里面
2. 运行"carthage update",将获取依赖文件到一个Carthage.checkout 文件夹,然后编译每个依赖
3. 在你的应用程序target的 'General' 设置标签中的 'Embedded Binaries' 区域,将框架从"Carthage.build文件夹拖拽进去"。

在这个过程当中,Carthage将创建一些build artifacts,其中最重要的是Cartfile.lock
文件,里面将列出每个框架的具体版本,确保你提交了这个文件到版本控制工具里面(如Git、SVN),因为每个用到项目的人都需要它来编译相同版本的框架。
完成上面的步骤并提交你的修改,项目的其他用户就只需要获取该仓库并执行carthage bootstrap 就能使用你所添加的框架。

添加框架到单元测试或另一个框架
使用Carthage添加框架到任意目标的方法,和添加到应用程序差不多。主要的不同在于框架是如何设置并链接到Xcode的。
因为非应用程序目标没有“Embedded Binaries”设置区域,你需要将编译完成后的框架拖拽到“Link Binaries With Libraries”的区域里。
在某些稀有案例中,你也许会想要复制每个依赖到已编译的项目中(比如,在外部框架中嵌入依赖,或确保依赖在测试工具中正常显示)。想要达到这个目的,你需要创建一个新的“Copy Files”编译选项和“Frameworks”组,然后将框架的引用添加到里面。

升级框架
如果你修改了Cartfile,或者你想升级到框架的最新版本(取决于你指定的需求版本),执行 carthage update 命令可以达到目的。

让你的框架支持Carthage
Carthage只正式支持动态框架,动态框架能够在任何版本的OS X上使用,但只能在iOS 8及以上版本使用。
因为Carthage拥有非中心化的包列表,以及没有项目指定的编译设置,大多数框架应该能自动编译。

分享你的Xcode schemes
Carthage将只从你的.xcodeproj 中标记为已分享的Xcode schemes来编译。如果你想检查编译是否成功,执行carthage build --no-skip-current命令,然后检查Carthage.build文件夹。
如果当执行命令但有scheme没有被编译,打开Xcode并确定对应scheme被标记为“Shared”,以便Carthage能够发现它。

解决编译失败
如果你在执行carthage build --no-skip-current
时编译失败,尝试执行xcodebuild -scheme SCHEME -workspace WORKSPACE buildxcodebuild -scheme SCHEME -project PROJECT build(将其中的大写单词换成你项目的对应名称),然后观察是否有相同的失败发生,这应该能生成足够的失败信息来解决问题。

1240

[5]Carthage:Xcode项目的GitHub依赖管理器 -- http://www.infoq.com/cn/news/2015/05/carthage-dependency-manager

引用源?

1:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验"

2:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验"

3:https://imtx.me/archives/1939.html "TUALATRIX -- Carthage 初探:四大优势与四大劣势"

4:https://github.com/Carthage/Carthage#adding-frameworks-to-an-application "GitHub.com"

 

转载于:https://my.oschina.net/u/2524932/blog/729410

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值