文檔地址https://github.com/Carthage/Carthage release v0.20.0
2017-3-21
Carthage
Carthage的目的是使用最簡(jiǎn)單的方式給你的Cocoa應(yīng)用添加frameworks
基本的工作流程如下:
- 創(chuàng)建一個(gè)Cartfile文件,里面包含你將要在你項(xiàng)目中使用的frameworks.
- 運(yùn)行Carthage,這將獲取和編譯你列出來(lái)的framework.
- 將編譯的
.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 update
和brew 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下使用
- 創(chuàng)建一個(gè)Cartfile文件,將你打算用的frameworks列在里面。
- 運(yùn)行
carthage update
命令。通過(guò)這個(gè)命令將獲取到的依賴放入Carthage/Checkouts
目錄下,并且編譯每個(gè)framework或者下載一個(gè)預(yù)編譯的framework. - 在應(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下使用
- 創(chuàng)建一個(gè)Cartfile文件,將你打算用的frameworks列在里面。
- 運(yùn)行
carthage update
命令。通過(guò)這個(gè)命令將獲取到的依賴放入Carthage/Checkouts
目錄下,并且編譯每個(gè)framework或者下載一個(gè)預(yù)編譯的framework. - 在項(xiàng)目的targets--“General”設(shè)置下,在“Linked Frameworks and Libraries”組下,將你想使用的framework從
Carthage/Build
目錄下拖拽進(jìn)去。 - 在項(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 build
或xcodebuild -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ā)行版是可行的。
通過(guò)
gem install travis
命令安裝travis CLI為您的存儲(chǔ)庫(kù)設(shè)置travis-ci(步驟1和2)
-
根據(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文件