Carthage和iOS組件二進(jìn)制化

比如大名鼎鼎的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é)果:


carthagebuild

Cartfile.resolved應(yīng)該和Podflie.lock一個(gè)作用具钥。

build了這么多平臺(tái)實(shí)在太慢了,所以可以指定平臺(tái):

carthage build --platform iOS

將 Carthage/Build/iOS 中的 framework 文件添加到項(xiàng)目中液兽。如圖:


carthageaddframework

然后在 Build Phrases 中骂删,點(diǎn)擊左上角的 + 號(hào),添加一個(gè) New Run Script Phrase。如圖:


carthagerunscript

使你的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è)插件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末息堂,一起剝皮案震驚了整個(gè)濱河市嚷狞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荣堰,老刑警劉巖床未,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異振坚,居然都是意外死亡薇搁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門渡八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啃洋,“玉大人传货,你說我怎么就攤上這事『曷Γ” “怎么了问裕?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孵坚。 經(jīng)常有香客問我粮宛,道長,這世上最難降的妖魔是什么十饥? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任窟勃,我火速辦了婚禮,結(jié)果婚禮上逗堵,老公的妹妹穿的比我還像新娘秉氧。我一直安慰自己,他們只是感情好蜒秤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布汁咏。 她就那樣靜靜地躺著,像睡著了一般作媚。 火紅的嫁衣襯著肌膚如雪攘滩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天纸泡,我揣著相機(jī)與錄音漂问,去河邊找鬼。 笑死女揭,一個(gè)胖子當(dāng)著我的面吹牛蚤假,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吧兔,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼磷仰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了境蔼?” 一聲冷哼從身側(cè)響起灶平,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箍土,沒想到半個(gè)月后逢享,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涮帘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年拼苍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片调缨。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疮鲫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弦叶,到底是詐尸還是另有隱情俊犯,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布伤哺,位于F島的核電站燕侠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏立莉。R本人自食惡果不足惜绢彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓耻。 院中可真熱鬧茫舶,春花似錦、人聲如沸刹淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有勾。三九已至疹启,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔼卡,已是汗流浹背喊崖。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雇逞,地道東北人荤懂。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像喝峦,于是被迫代替她去往敵國和親势誊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Carthage v0.26.2(原文鏈接) Carthage的目標(biāo)是用最簡(jiǎn)單的方式來管理Cocoa第三方框架谣蠢。 ...
    iOSLee閱讀 3,566評(píng)論 0 7
  • 文檔地址https://github.com/Carthage/Carthage release v0.20.0...
    指尖彈灰閱讀 4,480評(píng)論 2 4
  • 一是進(jìn)行考前監(jiān)督粟耻。高考前開展學(xué)校食堂、考生食宿點(diǎn)及周邊餐飲單位專項(xiàng)執(zhí)法檢查眉踱,全面排查各類食品安全隱患挤忙,確保食...
    成安縣委辦公室閱讀 107評(píng)論 0 0
  • 牛圈的誕生。 她的降臨谈喳,很簡(jiǎn)單册烈,我要把得到的文章,分享給小雅婿禽,璐璐赏僧,還有瓊瓊大猛,每天這樣要發(fā)三次,有一天淀零,我就煩了挽绩,...
    職業(yè)規(guī)劃師閱讀 542評(píng)論 15 6
  • 我們?cè)趯W(xué)習(xí)任何東西起初時(shí),我們應(yīng)該手動(dòng)擋進(jìn)行敲擊驾中,而不應(yīng)該使用自動(dòng)擋進(jìn)行復(fù)制和粘貼唉堪。我們只有在敲代碼的過程中,在這...
    flowerflower閱讀 13,480評(píng)論 0 4