Carthage 官文翻譯

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

2017-3-21

Carthage

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

基本的工作流程如下:

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

Carthage編譯你的依賴,并提供給你frameworks的二進(jìn)制文件,但你仍然保留對(duì)項(xiàng)目的結(jié)構(gòu)和設(shè)置的完全控制。Carthage不會(huì)自動(dòng)的修改你的項(xiàng)目文件或編譯設(shè)置。

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

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

首先,在默認(rèn)情況下,CocoaPods會(huì)為你的項(xiàng)目和依賴自動(dòng)創(chuàng)建和更新工作區(qū)間(Xcode workspace)。Carthage使用xcodebuild編譯framework的二進(jìn)制文件,但將他們的集成留給用戶來(lái)操作。因而,對(duì)于使用者來(lái)說(shuō),CocoaPods更為簡(jiǎn)單,而Carthage更為靈活并且對(duì)你的項(xiàng)目更少的入侵。

CocoaPods的目標(biāo)就如它的文檔中所說(shuō)的:

…為提高第三方開(kāi)源庫(kù)的可見(jiàn)性和參與度,創(chuàng)建一個(gè)更中心化的生態(tài)系統(tǒng)。

相比之下,Carthage是一個(gè)分散的依賴管理器,它沒(méi)有中心項(xiàng)目列表。這就減少了維護(hù)工作,并避免任何中心故障點(diǎn)(不需要維護(hù)中央服務(wù)器嘛,這很好理解)。這樣做,隨之而來(lái)的是一些缺點(diǎn),就是項(xiàng)目的發(fā)現(xiàn)將更困難,用戶將依賴于Github的趨勢(shì)頁(yè)面或者類似的代碼庫(kù)來(lái)尋找項(xiàng)目。

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

最終,我們創(chuàng)建了Carthage,因?yàn)槲覀兿胍詈?jiǎn)單的工具 - 一個(gè)依賴管理器,完成任務(wù)而不取代Xcode的部分功能,并且不為framework作者增加額外的工作。CocoaPods提供的那些神奇的特性Carthage永遠(yuǎn)不會(huì)有。因?yàn)槲覀儾粫?huì)用復(fù)雜度去換取那些特性。

安裝Carthage

安裝Carthage的方法多種多樣:

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

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

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

給應(yīng)用添加frameworks

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

開(kāi)始使用

如果你在OS X下使用

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

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

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

  1. 創(chuàng)建一個(gè)Cartfile文件,將你打算用的frameworks列在里面。
  2. 運(yùn)行carthage update命令。通過(guò)這個(gè)命令將獲取到的依賴放入Carthage/Checkouts目錄下,并且編譯每個(gè)framework或者下載一個(gè)預(yù)編譯的framework.
  3. 在項(xiàng)目的targets--“General”設(shè)置下,在“Linked Frameworks and Libraries”組下,將你想使用的framework從Carthage/Build目錄下拖拽進(jìn)去。
  4. 在項(xiàng)目的targets--"Build Phases"設(shè)置下,點(diǎn)擊“+”并選擇"New Run Script Phase",然后創(chuàng)建一個(gè)運(yùn)行腳本,在其中指定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

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

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

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

對(duì)于上述的兩個(gè)平臺(tái)

在整個(gè)過(guò)程中,Carthage將會(huì)創(chuàng)建一些artifacts。其中最重要的是Cartfile.resolved文件,它列出了為每個(gè)framework編譯的實(shí)際版本。確保提交你的Cartfile.resolved因?yàn)槿魏问褂迷擁?xiàng)目的人將通過(guò)該文件來(lái)編譯相同的framework版本。

Swift二進(jìn)制框架下載兼容性

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

因?yàn)镃arthage使用xcrun swift --version的輸出來(lái)確定本地Swift版本,所以請(qǐng)確保運(yùn)行Carthage命令,使用你打算使用的Swift工具鏈。對(duì)于大多數(shù)情況,不需要額外的去注意整個(gè)問(wèn)題。但是,舉例來(lái)說(shuō),如果你使用Xcode8.x 去編譯一個(gè)Swift2.3的項(xiàng)目,一種為carthage bootstrap指定默認(rèn)swift的方法是使用以下命令:

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

使用Carthage去運(yùn)行項(xiàng)目

在你完成上述步驟并將你的改變推送后,項(xiàng)目的其他使用者只需要獲取存儲(chǔ)庫(kù),并且運(yùn)行carthage bootstrap來(lái)開(kāi)始使用你添加的frameworks。

向單元測(cè)試或框架添加框架

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

因?yàn)閱卧獪y(cè)試target在其“General”設(shè)置選項(xiàng)卡中缺少“Linked Frameworks and Libraries”部分,所以必須將構(gòu)建的frameworks拖動(dòng)到“Link Binaries With Libraries”構(gòu)建階段。

在“Build Settings”選項(xiàng)卡下的測(cè)試目標(biāo)中,將@ loader_path/Frameworks添加到“Runpath Search Paths”(如果尚未存在)。

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

升級(jí)框架

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

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

carthage update Box

如果想更新兩個(gè)

carthage update Box Result

嵌套依賴關(guān)系

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

如果項(xiàng)目中的嵌入框架具有對(duì)其他框架的依賴性,則必須將它們鏈接到應(yīng)用程序目標(biāo)(即使應(yīng)用程序目標(biāo)對(duì)該框架沒(méi)有依賴性,也從不使用它們)。

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

通常,Carthage將會(huì)直接到你項(xiàng)目的目錄下檢查依賴的源文件,讓你在選擇時(shí)提交或忽略它們。如果你想有依賴項(xiàng)作為Git子模塊(或許這樣你可以提交和推送改變),你可以運(yùn)行carthage update 或者帶有--use-submodules標(biāo)志的carthage checkout

當(dāng)你運(yùn)行上述命令后,Carthage將.gitmodules.git/config文件寫(xiě)入你的存儲(chǔ)庫(kù),并在依賴項(xiàng)的版本更改時(shí)自動(dòng)更新子模塊。

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

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

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

需要注意的是,在執(zhí)行此操作之前應(yīng)該使用子模塊,因?yàn)椴粦?yīng)直接修改簡(jiǎn)單的檢出。

緩存構(gòu)建

默認(rèn)地,Carthage將重建一個(gè)依賴關(guān)系,無(wú)論它與以前是否是一樣的解析版本。通過(guò)--cache-bulids將會(huì)使得carthage去避免重建依賴。有關(guān)如何執(zhí)行此緩存的詳細(xì)信息,請(qǐng)參閱有關(guān)版本文件的信息。

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

使你的framework支持Carthage

Carthage 正式的只支持動(dòng)態(tài)框架。動(dòng)態(tài)框架在OS X的任何版本都可以使用,但I(xiàn)OS 只能是8或者8+。

因?yàn)镃arthage沒(méi)有集中的包列表,沒(méi)有項(xiàng)目規(guī)范格式,大多數(shù)框架應(yīng)該自動(dòng)構(gòu)建

任何框架項(xiàng)目的具體要求如下。

分享你的Xcode schemes(方案)

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

當(dāng)你運(yùn)行那個(gè)命令的時(shí)候如果有一個(gè)重要的方案沒(méi)有被編譯,打開(kāi)Xcdoe并確保該方案標(biāo)記為“共享”,以便Carthage可以發(fā)現(xiàn)它。

解決build失敗

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

如果你安裝了多個(gè)版本的Apple開(kāi)發(fā)者工具(例如Xcode beta版),請(qǐng)使用xcode-select更改Carthage使用的版本。

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

Carthage通過(guò)搜索在存儲(chǔ)庫(kù)上發(fā)布的標(biāo)記并嘗試將每個(gè)標(biāo)記名解釋為語(yǔ)義版本來(lái)確定您的框架的哪些版本可用。 例如,在標(biāo)簽v1.2中,語(yǔ)義版本是1.2.0。

沒(méi)有任何版本號(hào)的標(biāo)簽,或版本號(hào)后面的任何字符(例如,1.2-alpha-1)目前不被支持,將被忽略。

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

如果它們附加到項(xiàng)目存儲(chǔ)庫(kù)上的GitHub發(fā)行版或通過(guò)二進(jìn)制項(xiàng)目定義文件,Carthage可以自動(dòng)使用預(yù)構(gòu)建框架,而不是從頭開(kāi)始構(gòu)建。

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

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

carthage bulid --no-skip-current

carthage archive YourFrameworkName

將自動(dòng)忽略版本草稿,即便它們對(duì)應(yīng)于所需的標(biāo)簽。

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

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

  1. 通過(guò)gem install travis命令安裝travis CLI

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

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

    替換 PROJECT_PLACEHOLDER 和 SCHEME_PLACEHOLDER

    如果使用工作區(qū)而不是項(xiàng)目,請(qǐng)刪除xcode_project行,并取消注釋xcode_workspace行。

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

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

    隨時(shí)更新xcode_sdk值到另一個(gè)SDK,請(qǐng)注意,在iphoneos SDK上的測(cè)試將需要你上傳代碼簽名身份。

    詳情見(jiàn)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. 運(yùn)行``travis setup releases``

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

5. 更新部署部分通過(guò)帶標(biāo)簽的運(yùn)行如下命令:

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

on:
repo: repo/repo

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

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


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



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Carthage v0.26.2(原文鏈接) Carthage的目標(biāo)是用最簡(jiǎn)單的方式來(lái)管理Cocoa第三方框架。 ...
    iOSLee閱讀 3,654評(píng)論 0 7
  • 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別 首先來(lái)看什么是庫(kù),庫(kù)(Library)說(shuō)白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,070評(píng)論 3 42
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,241評(píng)論 4 61
  • 孔子并不用自己的禮儀道德標(biāo)準(zhǔn)來(lái)要求發(fā)小朋友。人一生,能有幾個(gè)好朋友呢?那小時(shí)候的朋友,是我們和過(guò)去時(shí)光的聯(lián)系,是我...
    華杉2009閱讀 885評(píng)論 0 2
  • 花有萬(wàn)千種 詩(shī)人多贊美 贊美那盛開(kāi)在陽(yáng)光下的美人 或可愛(ài)、或嬌艷、或高潔... 然而 又有幾人贊美 那枯黃的花瓣 ...
    厭屋及烏閱讀 289評(píng)論 0 1