文檔地址https://github.com/Carthage/Carthage release v0.20.0
2017-3-21
Carthage
Carthage的目的是使用最簡單的方式給你的Cocoa應(yīng)用添加frameworks
基本的工作流程如下:
- 創(chuàng)建一個Cartfile文件,里面包含你將要在你項目中使用的frameworks.
- 運行Carthage,這將獲取和編譯你列出來的framework.
- 將編譯的
.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 update
和brew 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下使用
- 創(chuàng)建一個Cartfile文件邀泉,將你打算用的frameworks列在里面嬉挡。
- 運行
carthage update
命令。通過這個命令將獲取到的依賴放入Carthage/Checkouts
目錄下汇恤,并且編譯每個framework或者下載一個預(yù)編譯的framework. - 在應(yīng)用的targets--“General”設(shè)置下庞钢,在“Embeddel Binaries”組下,將你想使用的framework從
Carthage/Build
目錄下拖拽進去因谎。
另外基括,你需要去copy調(diào)試符號,以便在OS X上調(diào)試和生成崩潰報告财岔。
如果你在 IOS, tvOS, watchOS下使用
- 創(chuàng)建一個Cartfile文件风皿,將你打算用的frameworks列在里面。
- 運行
carthage update
命令匠璧。通過這個命令將獲取到的依賴放入Carthage/Checkouts
目錄下桐款,并且編譯每個framework或者下載一個預(yù)編譯的framework. - 在項目的targets--“General”設(shè)置下,在“Linked Frameworks and Libraries”組下夷恍,將你想使用的framework從
Carthage/Build
目錄下拖拽進去魔眨。 - 在項目的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 build
或xcodebuild -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ā)行版是可行的酬滤。
通過
gem install travis
命令安裝travis CLI為您的存儲庫設(shè)置travis-ci(步驟1和2)
-
根據(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文件