比如大名鼎鼎的ReactCocoa赠堵。切到早期版本昼蛀,你根本找不到podspec弯院,說明它從未官方支持過CocoaPods◆嶙浚現(xiàn)在的ReactiveCocoa.podspec都是第三方發(fā)的。而從2.4.1起ReactCocoa開始使用Carthage偶房。
再比如Mantle也是一樣趁曼。Mantle更是直接在README中這樣說:
If you would prefer to use CocoaPods, there are some Mantle podspecs that have been generously contributed by third parties.
那么我們來講講Carthage。
Carthage翻譯過來就是“迦太基”(Qart-?ada?t棕洋,該詞源于腓尼基語挡闰,意為“新的城市”,英語:Carthage)的意思掰盘。我猜取這個(gè)名字大概取“新的城市”這個(gè)寓意吧摄悯。
Carthage是個(gè)后起之秀,從2014年10月開始庆杜。而CocoaPods資格更老一些射众,從2011年8月就開始了。從start來看晃财,CocoaPods是8262叨橱;Carthage是7397典蜕。他們已經(jīng)在一個(gè)數(shù)量級(jí)了。說明Carthage相比CocoaPods并不差罗洗。Carthage肯定是為了解決CocoaPods的某些問題而生愉舔。
查看Carthage的README。首先看到的是workflow伙菜。
1.Create a Cartfile that lists the frameworks you’d like to use in your project.
2.Run Carthage, which fetches and builds each framework you’ve listed.
3.Drag the built .framework binaries into your application’s Xcode project.
第一步創(chuàng)建一個(gè)Carfile列出你想要的庫轩缤。
這個(gè)CocoaPods一樣。
第二步運(yùn)行Carthage贩绕,它會(huì)拉去和編譯每一個(gè)庫火的。
說明還是需要編譯一遍的。
第三步把framework拽進(jìn)項(xiàng)目淑倾。
需要注意的還有這個(gè):
Once you have Carthage installed, you can begin adding frameworks to your project. Note that Carthage only supports dynamic frameworks, which are only available on iOS 8 or later (or any version of OS X).
Carthage只支持動(dòng)態(tài)庫馏鹤,所以只支持到iOS 8。
看一下Carthage自己的說明娇哆,它和CocoaPods的區(qū)別湃累。
CocoaPods is a long-standing dependency manager for Cocoa. So why was Carthage created?
Firstly, CocoaPods (by default) automatically creates and updates an Xcode workspace for your application and all dependencies. Carthage builds framework binaries using xcodebuild, but leaves the responsibility of integrating them up to the user. CocoaPods’ approach is easier to use, while Carthage’s is flexible and unintrusive.
關(guān)鍵詞:binaries、integrating碍讨、flexible治力、unintrusive。
- Carthage使用二進(jìn)制勃黍。
- 用戶自己集成進(jìn)去宵统。
- 更靈活。
- 非侵入溉躲。
The goal of CocoaPods is listed in its README as follows:
… to improve discoverability of, and engagement in, third party open-source libraries, by creating a more centralized ecosystem.
By contrast, Carthage has been created as a decentralized dependency manager. There is no central list of projects, which reduces maintenance work and avoids any central point of failure. However, project discovery is more difficult—users must resort to GitHub’s Trending pages or similar.
Carthage是個(gè)分散型的依賴管理器榜田。降低了維護(hù)工作和避免了集中管理的問題益兄。CocoaPods是個(gè)集中的生態(tài)系統(tǒng)锻梳。
Ultimately, we created Carthage because we wanted the simplest tool possible—a dependency manager that gets the job done without taking over the responsibility of Xcode, and without creating extra work for framework authors. CocoaPods offers many amazing features that Carthage will never have, at the expense of additional complexity.
最后,我們創(chuàng)建Carthage是為了創(chuàng)造一個(gè)更簡(jiǎn)單的工具净捅。創(chuàng)建一個(gè)依賴管理器去完成工作疑枯,而不用接手Xcode的職責(zé)。
CocoaPods提供了很多很棒的功能蛔六,Carthage永遠(yuǎn)不會(huì)以額外的復(fù)雜性作為代價(jià)去提供這些功能荆永。貌似這句才是最關(guān)鍵。
試用一下Carthage
安裝:
brew install carthage
當(dāng)前默認(rèn)安裝版本是0.11.0
創(chuàng)建Cartfile:
# Require version 2.3.1 or later
github "ReactiveCocoa/ReactiveCocoa" >= 2.3.1
# Require version 1.x
github "Mantle/Mantle" ~> 1.0 # (1.0 or later, but less than 2.0)
執(zhí)行carthage update
*** Cloning Mantle
*** Cloning ReactiveCocoa
*** Cloning Result
*** Cloning Nimble
*** Checking out ReactiveCocoa at "v4.2.2"
*** Checking out Result at "2.1.3"
*** Checking out Mantle at "1.5.8"
*** Cloning Quick
*** Cloning xcconfigs
*** Cloning Box
*** xcodebuild output can be found in /var/folders/w2/khz8t6h10q51lx_hvw8ds9wr0000gn/T/carthage-xcodebuild.Wwng0O.log
Failed to discover shared schemes in project Nimble.xcodeproj—either the project does not have any shared schemes, or xcodebuild never returned
If you believe this to be a project configuration error, please file an issue with the maintainers at https://github.com/Mantle/Mantle/issues/new
竟然失敗了国章。
執(zhí)行:
sudo rm -rf ~/Library/Caches/org.carthage.CarthageKit
carthage build
得到結(jié)果:
Cartfile.resolved應(yīng)該和Podflie.lock一個(gè)作用具钥。
build了這么多平臺(tái)實(shí)在太慢了,所以可以指定平臺(tái):
carthage build --platform iOS
將 Carthage/Build/iOS 中的 framework 文件添加到項(xiàng)目中液兽。如圖:
然后在 Build Phrases 中骂删,點(diǎn)擊左上角的 + 號(hào),添加一個(gè) New Run Script Phrase。如圖:
使你的framework支持Carthage
1.明確只最低支持iOS8宁玫。
2.共享你的Xcode schemes粗恢。Carthage會(huì)build你共享的Xcode schemes。
3.解決編譯的錯(cuò)誤欧瘪。
4.打上tag發(fā)布(上傳到代碼庫)眷射。
5.Carthage可以使用你預(yù)先生成的包含frameworks的zip文件,這樣就不用在使用者這邊編譯了佛掖。這個(gè)zip文件必須包含在你發(fā)布的tag中妖碉。
私有Carthage
其實(shí)很簡(jiǎn)單,發(fā)布到你自己的代碼源芥被,然后在Cartfile里面這樣寫就可以了:
git "https://gitlab.baidao.com/git-error-translations2.git" >= 1.0.1
看了下其他文檔和親身使用經(jīng)歷嗅绸。總結(jié)一下:
- Cartfile配置起來很簡(jiǎn)單撕彤。
- 使用Carthage鱼鸠,版本管理是不用擔(dān)心的。和CocoaPods類似羹铅。
- Cartfile不能加載深度依賴蚀狰。比如有個(gè)庫KKNetKit依賴AFNetwork。你不能只寫KKNetKit职员,還得顯示地寫上AFNetwork麻蹋。這一點(diǎn)和CocoaPods不同,CocoaPods會(huì)自動(dòng)幫你加入AFNetwork焊切。
- Carthage和你的項(xiàng)目并沒有直接的關(guān)系扮授。這也符合了它宣稱的非侵入。你可以在任意地方定義Cartfile专肪。
- Carthage一樣可以使用CI刹勃。例如travis CLI。
- 目前Carthage的CLI相比CocoaPods還是做的比較爛的嚎尤。也沒有很多功能荔仁。
- 現(xiàn)在支持Carthage的常用第三方庫并不是很多。Carthage目前也沒有像CocoaPods那樣提供一個(gè)search命令去查找?guī)煅克馈K晕也⒉荒苤烙心男┑谌綆熘С至薈arthage乏梁。
- 它會(huì)自動(dòng)創(chuàng)建submodule。這個(gè)專門放submodule文件夾叫Carthage/Checkouts关贵。
- 因?yàn)槭欠乔秩胧降挠銎铮枰约菏謩?dòng)去配置Xcode。這個(gè)有好處也有壞處揖曾。如果用到了很多庫落萎,會(huì)感覺麻煩势篡。
- 如果你有多個(gè)App的話,共用那些framework會(huì)非常爽模暗。但因?yàn)樾枰@樣配置"$(SRCROOT)/Carthage/Build/iOS/Mantle.framework"禁悠,你的本地路徑可能和其他人會(huì)不一樣,所以沒法在團(tuán)隊(duì)間共享兑宇。
- 我要調(diào)試源碼的話就變的比較麻煩碍侦。查看源碼可以在submodule中去找,但增加了麻煩隶糕。
- 首次carthage update時(shí)間會(huì)非常長瓷产。雖然我只是導(dǎo)入了2個(gè)庫而已。(那2個(gè)庫沒有提供archive zip)
- 因?yàn)闀r(shí)間非常長枚驻,所以就得考慮如何在Team中共享的問題濒旦。讓每個(gè)人都xcodebuild一遍時(shí)間太長了,上傳到git又太大了再登。
- 當(dāng)用CocoaPods時(shí)尔邓,pod install之后需要重新編譯所有CococaPods庫,哪怕我只改動(dòng)了一個(gè)CocoaPods庫的版本號(hào)锉矢。而Carthage也不能解決這個(gè)問題梯嗽。carthage update和carthage build也都會(huì)重新編譯一遍。而Carthage更慢沽损,因?yàn)镃ocoaPods只要編譯一個(gè)architect灯节,Carthage要編譯多個(gè)Architect。
- 如果那個(gè)Carthage的目標(biāo)庫沒有提供archive zip的話绵估,還是需要編譯一次炎疆。Team其他人也需要編譯一次。如果要徹底避免的話国裳,當(dāng)一個(gè)人編譯完形入,需要把frameworks都上傳到代碼庫上才行□锞龋或者自己壓個(gè)zip唯笙,內(nèi)網(wǎng)互相發(fā)送一下?
- 就算Carthage目標(biāo)庫支持archive zip盒使,他一定得支持全部平臺(tái),問題是我怎么告訴它我只需要iOS平臺(tái)的呢七嫌?全部clone下來少办,就中國這個(gè)網(wǎng)絡(luò)環(huán)境豈不是很痛苦。
Carthage的優(yōu)缺點(diǎn)都是非常鮮明的诵原,所以需要綜合自身的情況考慮英妓。
那用Carthage做組件二進(jìn)制化可不可以挽放?
我覺得是可以的。但有以下幾個(gè)問題需要解決蔓纠。
- 遷移的成本辑畦。一般大家都是用的CocoaPods。
- 只支持到iOS8腿倚。如果支持到iOS7的就沒有辦法了纯出。
- 沒有靈活的方式去切回源碼調(diào)試。查看源碼也不是很方便敷燎,畢竟不在一個(gè)workspace里面暂筝。
- 目前支持的第三方庫并不多。沒有像CocoaPods那樣普及硬贯。
我的建議是:CocoaPods和Carthage一起用焕襟。
Carthage解決了組件如何二進(jìn)制化的問題,加快了編譯速度饭豹。在開發(fā)時(shí)繼續(xù)使用CocoaPods可以查看弱業(yè)務(wù)組件和基礎(chǔ)功能組件的源碼鸵赖、以及調(diào)試源碼。第三方庫視情況而定拄衰,如果它支持Carthage就用Carthage卫漫。
具體做法是:在App主項(xiàng)目中,業(yè)務(wù)組件都是Carthage提供archive zip的方式集成進(jìn)來的肾砂。而在業(yè)務(wù)組件A的Example App中還是可以繼續(xù)使用CocoaPods加載弱業(yè)務(wù)組件和基礎(chǔ)功能組件和不支持Carthage的第三方組件列赎。參與集成調(diào)試的其他業(yè)務(wù)組件和支持Carthage的第三方庫可以通過Carthage集成進(jìn)來。
這篇文章只是提供了一種思路镐确。如果你原先一直使用CocoaPods又沒有迫切二進(jìn)制化的需求的話包吝,我覺得目前可以不考慮轉(zhuǎn)用Carthage。
即使你有二進(jìn)制化需求的話源葫,也可以參考我寫的這篇文章诗越。推薦還是使用CocoaPods加cocoapods-packager這個(gè)插件。