最近寫了個工具CarthagePods,將 Carthage 和 CocoaPods 配合一起使用。介紹我這個工具之前,先看看我們 iOS 開發(fā)最常用的兩個包管理器吧。
Carthage
Carthage 有個重要的優(yōu)點,它可以把依賴的庫都編譯成 framework,這樣一來就不需要每次編譯工程,都去編譯一遍依賴的第三方庫。
但是也存在一些缺點,例如:
- 使用的依賴庫比較多,集成起來就比較麻煩。
-
framework對@IBDesignable和@IBInspectable并不那么友好 =。= 。
CocoaPods
CocoaPods 正好可以解決 Carthage 的不足。CocoaPods 使用起來非常方便,因為他不會把依賴庫編譯提前編譯成 framework, 所以也不存在對 @IBDesignable 和 @IBInspectable 不友好的問題。
當然,他不會把第三方庫編譯成功 framework 這也會導致工程編譯起來比較慢。
取長補短
前段時間蝦神在他的公眾號中發(fā)布了一篇文章則提供類一個解決方案I have a pod, I have a carthage, En...。
然而操作起來還是略微麻煩=。=
這樣我們就可以將使用 @IBDesignable 和 @IBInspectable 屬性的庫還是使用 CocoaPods 來管理。沒使用的則使用 Carthage 。
方案流程
蝦神文章中大概的實現方案流程是這樣的:
- 先使用
Carthage把一些依賴庫編譯成framework。 - 通過
CocoaPods把framework打包repo - 最后通過
CocoaPods把所有的依賴庫都 install 了。
蝦神的方案很酷,但是使用起來還是略為麻煩。所以我決定使用 Ruby 來把這些流程串聯(lián)起來,只需要簡單的敲個 install 就能完成這些工作 -
為什么使用 Ruby ?因為我想學 Ruby ,拿來練手=。=
CarthagePods
安裝方法
gem install CarthagePods
介紹
接下來簡單介紹一下 CarthagePods 的一些命令吧。

init
會生成 CocoaPods 的 Podfile 文件, Carthage 的 Cartfile 文件, 和一個 CPodfile。
大家使用的時候可以和往常使用 CocoaPods 和 Carthage ,一樣把依賴的庫配置到對應的文件中。
那 CPodfile 又是什么鬼?
我在使用我最常用的庫 RxSwift 時,發(fā)現了一個問題。RxSwift 使用 Carthage 編譯時會生成一個 RxTest 的 framework 。如果你工程中包含了這個 framework 會導致你打包失敗。所以 CPodfile 則提供了一種方法把需要過濾的 framework 給過濾掉。
使用方法如下:
filterFramework ['RxTest.framework', 'RxBlocking.framework']
install
install 命令則是分別執(zhí)行 CocoaPods 的 install 命令 和 Carthage 的 bootstrap 命令。
考慮到保留兩個工具的功能,這里盡可能保留了兩個工具 install 時的參數。

熟悉 Carthage 可能會發(fā)現,少了個 --platform。
我們使用 CocoaPods 是其實會在 Podfile 中直接定對應的平臺,所以這里的參數,工具會直接在 Podfile 中獲取。
update
這個命令就是分別執(zhí)行 CocoaPods 和 Carthage 的 update 命令。功能與 install 相似。
遺留問題
- 兩個庫,一個使用
CocoaPods, 一個使用Carthage去 install,如果這兩個庫同時依賴于另外一個庫。這種場景可能會產生問題。(這個問題會在后續(xù)版本解決) - 我開發(fā)的時候希望能使用
RxTest,發(fā)布的時候把它過濾掉。這個目前還是比較難辦的。
不過退一步想,我們遇到這些情況還是都可以幾乎無痛的,把一些庫切換使用 CocoaPods 做依賴管理。
最后歡迎大家嘗試使用我這個工具,歡迎 Issue 。我會盡我最大努力去維護它。