最近写了个工具CarthagePods,将 Carthage 和 CocoaPods 配合一起使用。介绍我这个工具之前,先看看我们 iOS 开发最常用的两个包管理器吧。
Carthage
Carthage 有个重要的优点,它可以把依赖的库都编译成 framework,这样一来就不需要每次编译工程,都去编译一遍依赖的第三方库。
但是也存在一些缺点,例如:
- 使用的依赖库比较多,集成起来就比较麻烦。
-
framework对@IBDesignable和@IBInspectable并不那么友好 =。= 。
CocoaPods
CocoaPods 正好可以解决 Carthage 的不足。CocoaPods 使用起来非常方便,因为他不会把依赖库编译提前编译成 framework, 所以也不存在对 @IBDesignable 和 @IBInspectable 不友好的问题。
当然,他不会把第三方库编译成功 framework 这也会导致工程编译起来比较慢。
取长补短
前段时间虾神在他的公众号中发布了一篇文章则提供类一个解决方案I have a pod, I have a carthage, En...。
然而操作起来还是略微麻烦=。=
这样我们就可以将使用 @IBDesignable 和 @IBInspectable 属性的库还是使用 CocoaPods 来管理。没使用的则使用 Carthage 。
方案流程
虾神文章中大概的实现方案流程是这样的:
- 先使用
Carthage把一些依赖库编译成framework。 - 通过
CocoaPods把framework打包repo - 最后通过
CocoaPods把所有的依赖库都 install 了。
虾神的方案很酷,但是使用起来还是略为麻烦。所以我决定使用 Ruby 来把这些流程串联起来,只需要简单的敲个 install 就能完成这些工作 -
为什么使用 Ruby ?因为我想学 Ruby ,拿来练手=。=
CarthagePods
安装方法
gem install CarthagePods
介绍
接下来简单介绍一下 CarthagePods 的一些命令吧。

init
会生成 CocoaPods 的 Podfile 文件, Carthage 的 Cartfile 文件, 和一个 CPodfile。
大家使用的时候可以和往常使用 CocoaPods 和 Carthage ,一样把依赖的库配置到对应的文件中。
那 CPodfile 又是什么鬼?
我在使用我最常用的库 RxSwift 时,发现了一个问题。RxSwift 使用 Carthage 编译时会生成一个 RxTest 的 framework 。如果你工程中包含了这个 framework 会导致你打包失败。所以 CPodfile 则提供了一种方法把需要过滤的 framework 给过滤掉。
使用方法如下:
filterFramework ['RxTest.framework', 'RxBlocking.framework']
install
install 命令则是分别执行 CocoaPods 的 install 命令 和 Carthage 的 bootstrap 命令。
考虑到保留两个工具的功能,这里尽可能保留了两个工具 install 时的参数。

熟悉 Carthage 可能会发现,少了个 --platform。
我们使用 CocoaPods 是其实会在 Podfile 中直接定对应的平台,所以这里的参数,工具会直接在 Podfile 中获取。
update
这个命令就是分别执行 CocoaPods 和 Carthage 的 update 命令。功能与 install 相似。
遗留问题
- 两个库,一个使用
CocoaPods, 一个使用Carthage去 install,如果这两个库同时依赖于另外一个库。这种场景可能会产生问题。(这个问题会在后续版本解决) - 我开发的时候希望能使用
RxTest,发布的时候把它过滤掉。这个目前还是比较难办的。
不过退一步想,我们遇到这些情况还是都可以几乎无痛的,把一些库切换使用 CocoaPods 做依赖管理。
最后欢迎大家尝试使用我这个工具,欢迎 Issue 。我会尽我最大努力去维护它。