Carthage 官文翻譯

文檔地址https://github.com/Carthage/Carthage release v0.20.0

2017-3-21

Carthage

Carthage的目的是使用最簡單的方式給你的Cocoa應(yīng)用添加frameworks

基本的工作流程如下:

  1. 創(chuàng)建一個Cartfile文件,里面包含你將要在你項目中使用的frameworks.
  2. 運行Carthage,這將獲取和編譯你列出來的framework.
  3. 將編譯的.framework二進制文件拖進你的項目工程。

Carthage編譯你的依賴,并提供給你frameworks的二進制文件扛邑,但你仍然保留對項目的結(jié)構(gòu)和設(shè)置的完全控制。Carthage不會自動的修改你的項目文件或編譯設(shè)置奋构。

Carthage和我們常用的CocoaPods有什么不同呢听系?

CocoaPods是一個存在很久的Cocoa依賴管理器了恳谎,那我們?yōu)槭裁催€要用Carthage呢?

首先瓢对,在默認情況下寿酌,CocoaPods會為你的項目和依賴自動創(chuàng)建和更新工作區(qū)間(Xcode workspace)。Carthage使用xcodebuild編譯framework的二進制文件硕蛹,但將他們的集成留給用戶來操作醇疼。因而,對于使用者來說法焰,CocoaPods更為簡單秧荆,而Carthage更為靈活并且對你的項目更少的入侵。

CocoaPods的目標就如它的文檔中所說的:

…為提高第三方開源庫的可見性和參與度埃仪,創(chuàng)建一個更中心化的生態(tài)系統(tǒng)乙濒。

相比之下,Carthage是一個分散的依賴管理器贵试,它沒有中心項目列表琉兜。這就減少了維護工作,并避免任何中心故障點(不需要維護中央服務(wù)器嘛毙玻,這很好理解)。這樣做廊散,隨之而來的是一些缺點桑滩,就是項目的發(fā)現(xiàn)將更困難,用戶將依賴于Github的趨勢頁面或者類似的代碼庫來尋找項目允睹。

CocoaPods項目還必須具有podspec文件运准,它包含有關(guān)項目的元數(shù)據(jù)及明確項目的編譯方法。Carthage使用xcodebuild去編譯依賴缭受,而不是將依賴集成到一個單一的工作區(qū)間胁澳,它沒有類似的規(guī)范文件(例如CocoaPods 的 podspec),但你的依賴必須包括它們自己的Xcode工程文件來描述是如何編譯它們的項目米者。

最終韭畸,我們創(chuàng)建了Carthage,因為我們想要最簡單的工具 - 一個依賴管理器蔓搞,完成任務(wù)而不取代Xcode的部分功能胰丁,并且不為framework作者增加額外的工作。CocoaPods提供的那些神奇的特性Carthage永遠不會有喂分。因為我們不會用復(fù)雜度去換取那些特性锦庸。

安裝Carthage

安裝Carthage的方法多種多樣:

  • Installer:下載并運行最新版的Carthage.pkg文件,然后按屏幕提示操作即可蒲祈。

  • Homebrew:你可以使用Homebrew并且在你的系統(tǒng)上安裝carthage工具甘萧。只需要運行brew updatebrew install carthage命令就可以了(note:如果你以前安裝過二進制版本的Carthage,你應(yīng)該先刪除掉 /Library/Frameworks/CarthageKit.framework).

  • Form source:如果你想運行最新版的開發(fā)版(它可能是很不穩(wěn)定或者不相容的)萝嘁,只需clone存儲庫的master分支,然后運行make install扬卷。 要求Xcode 8.2(Swift 3.0.2)

給應(yīng)用添加frameworks

當你安裝了Carthage后酿愧,你就可以給你的工程添加frameworks了。需要注意的是Carthage只支持動態(tài)frameworks.而動態(tài)framework只在IOS8及其以后支持(OS X是任意版本)

開始使用

如果你在OS X下使用

  1. 創(chuàng)建一個Cartfile文件邀泉,將你打算用的frameworks列在里面嬉挡。
  2. 運行carthage update命令。通過這個命令將獲取到的依賴放入Carthage/Checkouts目錄下汇恤,并且編譯每個framework或者下載一個預(yù)編譯的framework.
  3. 在應(yīng)用的targets--“General”設(shè)置下庞钢,在“Embeddel Binaries”組下,將你想使用的framework從Carthage/Build目錄下拖拽進去因谎。

另外基括,你需要去copy調(diào)試符號,以便在OS X上調(diào)試和生成崩潰報告财岔。

如果你在 IOS, tvOS, watchOS下使用

  1. 創(chuàng)建一個Cartfile文件风皿,將你打算用的frameworks列在里面。
  2. 運行carthage update命令匠璧。通過這個命令將獲取到的依賴放入Carthage/Checkouts目錄下桐款,并且編譯每個framework或者下載一個預(yù)編譯的framework.
  3. 在項目的targets--“General”設(shè)置下,在“Linked Frameworks and Libraries”組下夷恍,將你想使用的framework從Carthage/Build目錄下拖拽進去魔眨。
  4. 在項目的targets--"Build Phases"設(shè)置下,點擊“+”并選擇"New Run Script Phase",然后創(chuàng)建一個運行腳本酿雪,在其中指定shell(例如/bin/sh)遏暴,將以下內(nèi)容添加到shell下面的腳本區(qū)域:
/usr/local/bin/carthage copy-frameworks

并在“Input Files”下添加要使用的框架的路徑,例如:

$(SRCROOT)/Carthage/Build/iOS/Box.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/  ReactiveCocoa.framework

此腳本處理由通用二進制文件觸發(fā)的App Store提交錯誤指黎,并確保在歸檔時復(fù)制必需的bitcode-related文件和dSYM朋凉。

通過將調(diào)試信息復(fù)制到已經(jīng)編譯的工程的目錄中,只要在斷點處停止醋安,Xcode就能夠?qū)Χ褩8欉M行符號化杂彭。它也使你在調(diào)試器中通過第三方代碼。

當打包程序提交到App Store或TestFlight時茬故,Xcode還會將這些文件復(fù)制到應(yīng)用程序的.xcarchive包的dSYMs子目錄中盖灸。

對于上述的兩個平臺

在整個過程中,Carthage將會創(chuàng)建一些artifacts磺芭。其中最重要的是Cartfile.resolved文件赁炎,它列出了為每個framework編譯的實際版本。確保提交你的Cartfile.resolved因為任何使用該項目的人將通過該文件來編譯相同的framework版本徙垫。

Swift二進制框架下載兼容性

Carthage將檢查以確保下載的Swift(和混合的Objective-C / Swift)框架是使用本地使用的相同版本的Swift構(gòu)建的讥裤。 如果有版本不匹配,Carthage將繼續(xù)從源代碼構(gòu)建框架姻报。 如果框架不能從源代碼構(gòu)建己英,Carthage將失敗。

因為Carthage使用xcrun swift --version的輸出來確定本地Swift版本吴旋,所以請確保運行Carthage命令损肛,使用你打算使用的Swift工具鏈。對于大多數(shù)情況荣瑟,不需要額外的去注意整個問題治拿。但是,舉例來說笆焰,如果你使用Xcode8.x 去編譯一個Swift2.3的項目劫谅,一種為carthage bootstrap指定默認swift的方法是使用以下命令:

TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage bootstrap

使用Carthage去運行項目

在你完成上述步驟并將你的改變推送后,項目的其他使用者只需要獲取存儲庫嚷掠,并且運行carthage bootstrap來開始使用你添加的frameworks捏检。

向單元測試或框架添加框架

對任何任意target的依賴性使用Carthage非常類似于前面提到的給應(yīng)用添加frameworks。 主要的區(qū)別在于frameworks如何在Xcode中設(shè)置和鏈接不皆。

因為單元測試target在其“General”設(shè)置選項卡中缺少“Linked Frameworks and Libraries”部分贯城,所以必須將構(gòu)建的frameworks拖動到“Link Binaries With Libraries”構(gòu)建階段。

在“Build Settings”選項卡下的測試目標中粟焊,將@ loader_path/Frameworks添加到“Runpath Search Paths”(如果尚未存在)冤狡。

在極少數(shù)情況下,你可能想將每個依賴復(fù)制到你構(gòu)建的產(chǎn)品中(例如项棠,在外部框架中嵌入依賴項,或確保測試包中存在依賴性)挎峦。 為此香追,使用“Framework”目標創(chuàng)建一個新的“Copy Files”構(gòu)建階段,然后在那里添加框架引用坦胶。

升級框架

如果你已經(jīng)修改了你的Cartfile透典,或者你想去更新每個框架到最新版本(在你指定要求在下進行),只需要簡單的運行carthage update命令顿苇。

如果你只想更新一個或特定的依賴項峭咒,只需要將它們作為以空格分隔的列表傳遞給update命令。例如

carthage update Box

如果想更新兩個

carthage update Box Result

嵌套依賴關(guān)系

如果你想添加到項目中的框架的依賴已經(jīng)出現(xiàn)在Cartfile中了纪岁,Carthage將會為你自動檢索它們凑队。然后,你必須從Carthage/Build 文件夾將它們自己拖動到你的項目中幔翰。

如果項目中的嵌入框架具有對其他框架的依賴性漩氨,則必須將它們鏈接到應(yīng)用程序目標(即使應(yīng)用程序目標對該框架沒有依賴性西壮,也從不使用它們)。

使用子模塊的依賴關(guān)系

通常叫惊,Carthage將會直接到你項目的目錄下檢查依賴的源文件款青,讓你在選擇時提交或忽略它們。如果你想有依賴項作為Git子模塊(或許這樣你可以提交和推送改變)霍狰,你可以運行carthage update 或者帶有--use-submodules標志的carthage checkout 抡草。

當你運行上述命令后,Carthage將.gitmodules.git/config文件寫入你的存儲庫蔗坯,并在依賴項的版本更改時自動更新子模塊康震。

自動重建依賴關(guān)系

如果要在開發(fā)期間處理依賴項,并希望在構(gòu)建你的父項目時自動重新構(gòu)建它們步悠,則可以添加調(diào)用Carthage的 Run Script構(gòu)建階段签杈,如下所示:

/usr/local/bin/carthage build --platform "$PLATFORM_NAME" --project-directory "$SRCROOT"

需要注意的是,在執(zhí)行此操作之前應(yīng)該使用子模塊鼎兽,因為不應(yīng)直接修改簡單的檢出答姥。

緩存構(gòu)建

默認地,Carthage將重建一個依賴關(guān)系谚咬,無論它與以前是否是一樣的解析版本鹦付。通過--cache-bulids將會使得carthage去避免重建依賴。有關(guān)如何執(zhí)行此緩存的詳細信息择卦,請參閱有關(guān)版本文件的信息敲长。

注意:此時--cache-builds--use-submodules不兼容。 使用這兩者將導(dǎo)致工作副本和對子模塊依賴關(guān)系的更改提交不能正確重建秉继。

使你的framework支持Carthage

Carthage 正式的只支持動態(tài)框架祈噪。動態(tài)框架在OS X的任何版本都可以使用,但IOS 只能是8或者8+尚辑。

因為Carthage沒有集中的包列表辑鲤,沒有項目規(guī)范格式,大多數(shù)框架應(yīng)該自動構(gòu)建杠茬。

任何框架項目的具體要求如下月褥。

分享你的Xcode schemes(方案)

Carthage將只構(gòu)建從.xcodeproj共享的Xcode方案。你可以通過運行carthage build --no-skip-current瓢喉,然后檢查 Carthage/Build 文件夾來查看是否成功創(chuàng)建了所有計劃的方案宁赤。

當你運行那個命令的時候如果有一個重要的方案沒有被編譯,打開Xcdoe并確保該方案標記為“共享”栓票,以便Carthage可以發(fā)現(xiàn)它决左。

解決build失敗

如果你在運行Carthage build --no-skip-current中遇到構(gòu)建失敗,請嘗試運行xcodebuild -scheme SCHEME -workspace WORKSPACE buildxcodebuild -scheme SCHEME -project PROJECT build(使用實際值),并查看是否發(fā)生相同的故障哆窿。 這應(yīng)該能產(chǎn)生足夠的信息來解決問題链烈。

如果你安裝了多個版本的Apple開發(fā)者工具(例如Xcode beta版),請使用xcode-select更改Carthage使用的版本挚躯。

標簽穩(wěn)定版本(Tag stable releases)

Carthage通過搜索在存儲庫上發(fā)布的標記并嘗試將每個標記名解釋為語義版本來確定您的框架的哪些版本可用强衡。 例如,在標簽v1.2中码荔,語義版本是1.2.0漩勤。

沒有任何版本號的標簽,或版本號后面的任何字符(例如缩搅,1.2-alpha-1)目前不被支持越败,將被忽略。

將預(yù)編譯的框架歸檔到一個zip文件中

如果它們附加到項目存儲庫上的GitHub發(fā)行版或通過二進制項目定義文件硼瓣,Carthage可以自動使用預(yù)構(gòu)建框架究飞,而不是從頭開始構(gòu)建。

要為特定標記提供預(yù)構(gòu)建框架堂鲤,所有被支持的平臺的二進制文件應(yīng)該一起壓縮到一個歸檔中亿傅,并且該歸檔應(yīng)附加到與該標記相對應(yīng)的已發(fā)布版本。 附件應(yīng)在其名稱中包括.framework(例如ReactiveCocoa.framework.zip)瘟栖,以向Carthage表明其包含二進制文件葵擎。

你可以像下面這樣通過carthage archive命令執(zhí)行歸檔操作:

carthage bulid --no-skip-current

carthage archive YourFrameworkName

將自動忽略版本草稿,即便它們對應(yīng)于所需的標簽半哟。

使用travis-ci上傳你標記的預(yù)構(gòu)建框架

通過使用travis-ci去編譯和上傳你標記的發(fā)行版是可行的酬滤。

  1. 通過gem install travis命令安裝travis CLI

  2. 為您的存儲庫設(shè)置travis-ci(步驟1和2)

  3. 根據(jù)該模板在存儲庫的根目錄中,創(chuàng)建.tarvis.yml文件寓涨,將“FRAMEWORK_NAME”設(shè)置為正確的值盯串。

    替換 PROJECT_PLACEHOLDER 和 SCHEME_PLACEHOLDER

    如果使用工作區(qū)而不是項目,請刪除xcode_project行戒良,并取消注釋xcode_workspace行嘴脾。

    項目的格式應(yīng)該是:MyProject.xcodeproj

    工作區(qū)間的格式應(yīng)該是:MyWorkspace.xcworkspace

    隨時更新xcode_sdk值到另一個SDK,請注意蔬墩,在iphoneos SDK上的測試將需要你上傳代碼簽名身份。

    詳情見travis docs for objective-c projects

    language: objective-c
    

osx_image: xcode7.3
xcode_project: <PROJECT_PLACEHOLDER>

xcode_workspace: <WORKSPACE_PLACEHOLDER>

xcode_scheme: <SCHEME_PLACEHOLDER>
xcode_sdk: iphonesimulator9.3
env:
global:
- FRAMEWORK_NAME=<THIS_IS_A_PLACEHOLDER_REPLACE_ME>
before_install:

  • brew update
  • brew outdated carthage || brew upgrade carthage
    before_script:

bootstrap the dependencies for the project

you can remove if you don't have dependencies

  • carthage bootstrap
    before_deploy:
  • carthage build --no-skip-current
  • carthage archive $FRAMEWORK_NAME

4. 運行``travis setup releases``

此命令會將你的github憑據(jù)編碼到.travis.yml文件中耗拓,以便讓travis將發(fā)行版上傳到github.com當提示您上傳文件時拇颅,輸入$ FRAMEWORK_NAME.framework.zip

5. 更新部署部分通過帶標簽的運行如下命令:

在 ``.travis.yml``中查找

on:
repo: repo/repo

添加``tags:true``和``skip_cleanup:true``: 

skip_cleanup: true
on:
repo: repo/repo
tags: true


這將讓travis知道在推送新標簽時創(chuàng)建部署,并阻止travis清理生成的zip文件



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乔询,一起剝皮案震驚了整個濱河市樟插,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖黄锤,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搪缨,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸵熟,警方通過查閱死者的電腦和手機副编,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來流强,“玉大人痹届,你說我怎么就攤上這事〈蛟拢” “怎么了队腐?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奏篙。 經(jīng)常有香客問我柴淘,道長,這世上最難降的妖魔是什么秘通? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任为严,我火速辦了婚禮,結(jié)果婚禮上充易,老公的妹妹穿的比我還像新娘梗脾。我一直安慰自己,他們只是感情好盹靴,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布炸茧。 她就那樣靜靜地躺著,像睡著了一般稿静。 火紅的嫁衣襯著肌膚如雪梭冠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天改备,我揣著相機與錄音控漠,去河邊找鬼。 笑死悬钳,一個胖子當著我的面吹牛盐捷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播默勾,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼碉渡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了母剥?” 一聲冷哼從身側(cè)響起滞诺,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤形导,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后习霹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朵耕,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年淋叶,在試婚紗的時候發(fā)現(xiàn)自己被綠了阎曹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡爸吮,死狀恐怖芬膝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情形娇,我是刑警寧澤锰霜,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站桐早,受9級特大地震影響癣缅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哄酝,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一友存、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陶衅,春花似錦屡立、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罩句,卻和暖如春焚刺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背门烂。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工乳愉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屯远。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓蔓姚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慨丐。 傳聞我的和親對象是個殘疾皇子赂乐,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • Carthage v0.26.2(原文鏈接) Carthage的目標是用最簡單的方式來管理Cocoa第三方框架。 ...
    iOSLee閱讀 3,566評論 0 7
  • 靜態(tài)庫與動態(tài)庫的區(qū)別 首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進制代碼崩溪,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,882評論 3 42
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫浅役、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • 孔子并不用自己的禮儀道德標準來要求發(fā)小朋友伶唯。人一生觉既,能有幾個好朋友呢?那小時候的朋友乳幸,是我們和過去時光的聯(lián)系瞪讼,是我...
    華杉2009閱讀 855評論 0 2
  • 花有萬千種 詩人多贊美 贊美那盛開在陽光下的美人 或可愛、或嬌艷粹断、或高潔... 然而 又有幾人贊美 那枯黃的花瓣 ...
    厭屋及烏閱讀 278評論 0 1