Carthage v0.26.2(原文鏈接)
Carthage的目標是用最簡單的方式來管理Cocoa第三方框架。
基本的工作流如下:
1、創建一個Cartfile,包含你希望在項目中使用的框架的列表
2、運行Carthage,將會獲取列出的框架并編譯它們
3、將編譯完成的.framework二進制文件拖拽到你的Xcode項目當中
Carthage編譯你的依賴,并提供框架的二進制文件,但你仍然保留對項目的結構和設置的完整控制。Carthage不會自動的修改你的項目文件或編譯設置。
Carthage 和 CocoaPods的區別
CocoaPods是已存在很長時間的Cocoa依賴管理器,那么為什么要創建Carthage呢?
首先,CocoaPods默認會自動創建并更新你的應用程序和所有依賴的Xcode workspace。Carthage使用xcodebuild來編譯框架的二進制文件,但如何集成它們將交由用戶自己判斷。CocoaPods的方法更易于使用,但Carthage更靈活并且是非侵入性的。
CocoaPods的目標在它的README文件描述如下:
…為提高第三方開源庫的可見性和參與度,創建一個更中心化的生態系統。
Carthage創建的是去中心化的依賴管理器。它沒有總項目的列表,這能夠減少維護工作并且避免任何中心化帶來的問題(如中央服務器宕機)。不過,這樣也有一些缺點,就是項目的發現將更困難,用戶將依賴于Github的趨勢頁面或者類似的代碼庫來尋找項目。
CocoaPods項目同時還必須包含一個podspec文件,里面是項目的一些元數據,以及確定項目的編譯方式。Carthage使用xcodebuild來編譯依賴,而不是將他們集成進一個workspace,因此無需類似的設定文件。不過依賴需要包含自己的Xcode工程文件來描述如何編譯。
最后,我們創建Carthage的原因是想要一種盡可能簡單的工具——一個只關心本職工作的依賴管理器,而不是取代部分Xcode的功能,或者需要 讓框架作者做一些額外的工作。CocoaPods提供的一些特性很棒,但由于附加的復雜性,它們將不會被包含在Carthage當中。
安裝Carthage
Carthage的安裝有多種選擇:
1、Installer:Carthage提供OS X平臺的pkg安裝文件,你可以從Github的最新release中找到,按照引導一步步安裝即可。
2、Homebrew:你可以在你的OS X平臺中簡單的使用Homebrew命令行brew update和brew install carthage來安裝Carthage工具。(注意:如果在此之前你已經安裝了二進制版本的Carthage,你應該刪除它/Library/Frameworks/CarthageKit.framework)
3、From source:如果你想安裝最新的開發版本(可能存在穩定性和兼容性的問題),你只需要clone本倉庫的master分支,然后運行make install.。需要Xcode 9.0 (Swift 4.0)
添加框架到應用程序
安裝完Carthage后,你能夠使用它來添加框架到你的項目。注意Carthage只支持動態框架,而后者只存在于iOS 8以上(以及任意版本的OS X)。
開始使用
如果你構建的平臺是OS X
1、創建一個Cartfile,將你想要使用的框架列在里面
2、運行carthage update,將獲取依賴文件到一個Carthage.checkout文件夾,然后編譯每個依賴
3、在應用的targets--“General”設置下,在“Embeddel Binaries”組下,將你想使用的framework從Carthage/Build目錄下拖拽進去。
另外,你需要去copy調試符號,以便在OS X上調試和生成崩潰報告。
1、在你應用target的“Build Phases”設置標簽中,點擊“+”號并選擇“New Copy Files Phase”。
2、點擊“Destination”下拉菜單并選擇“Products Directory“。
3、為每個你使用的框架拖放相應的dSYM文件。
如果你構建的平臺是iOS, tvOS, or watchOS
1、創建一個Cartfile,將你想要使用的框架列在里面
2、運行carthage update,將獲取依賴文件到一個Carthage.checkout文件夾,然后編譯每個依賴
3、在應用的targets--“General”設置下,在“Embeddel Binaries”組下,將你想使用的framework從Carthage/Build目錄下拖拽進去。
4、在項目的targets--"Build Phases"設置下,點擊“+”并選擇"New Run Script Phase",然后創建一個運行腳本,在其中指定shell(例如/bin/sh),將以下內容添加到shell下面的腳本區域:
/usr/local/bin/carthage copy-frameworks
5、在“Input Files”下添加你想使用的framework的路徑。例如:
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveSwift.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
6、Add the paths to the copied frameworks to the “Output Files”, e.g.:
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveSwift.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveCocoa.framework
With output files specified alongside the input files, Xcode only needs to run the script when the input files have changed or the output files are missing. This means dirty builds will be faster when you haven't rebuilt frameworks with Carthage.
This script works around anApp Store submission bugtriggered by universal binaries and ensures that necessary bitcode-related files and dSYMs are copied when archiving.
With the debug information copied into the built products directory, Xcode will be able to symbolicate the stack trace whenever you stop at a breakpoint. This will also enable you to step through third-party code in the debugger.
When archiving your application for submission to the App Store or TestFlight, Xcode will also copy these files into the dSYMs subdirectory of your application’s.xcarchivebundle.
對于上述的兩個平臺
在整個過程當中,Carthage將創建一些build artifacts,其中最重要的是Cartfile.lock文件,里面將列出每個框架的具體版本,確保你提交了這個文件到版本控制工具里面(如Git、SVN),因為每個用到項目的人都需要它來編譯相同版本的框架。
(可選地)添加build phase以警告過時的依賴項
您可以添加一個Run Script phase,當你依賴項過時的時候會自動警告您。
在項目的targets--"Build Phases"設置下,點擊“+”并選擇"New Run Script Phase",然后創建一個運行腳本,在其中指定shell(例如/bin/sh),將以下內容添加到shell下面的腳本區域:
/usr/local/bin/carthage outdated --xcode-warnings
Swift二進制框架下載兼容性
Carthage將確認下載的Swift(和混合的objective - c / Swift)框架是與本地使用的相同版本的Swift構建。 如果有版本不匹配,Carthage將繼續從源代碼構建框架。 如果框架不能從源代碼構建,Carthage將失敗。
因為Carthage使用xcrun swift --version的輸出來確定本地Swift版本,確保使用您想要使用的Swift工具鏈運行Carthage命令。對于大多數情況,不需要額外的去注意整個問題。但是,舉例來說,如果你使用Xcode8.x 去編譯一個Swift2.3的項目,一種為carthage bootstrap指定默認swift的方法是使用以下命令:
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage bootstrap
使用Carthage去運行項目
在你完成上述步驟并將你的改變推送后,項目的其他使用者只需要獲取存儲庫,并且運行carthage bootstrap來開始使用你添加的frameworks。
向單元測試或框架添加框架
對任何任意target的依賴性使用Carthage非常類似于前面提到的給應用添加frameworks。 主要的區別在于frameworks如何在Xcode中設置和鏈接。
因為單元測試target在其“General”設置選項卡中缺少“Linked Frameworks and Libraries”部分,所以必須將構建的frameworks拖動到“Link Binaries With Libraries”構建階段。
在“Build Settings”選項卡下的測試目標中,將@ loader_path/Frameworks添加到“Runpath Search Paths”(如果尚未存在)。
在極少數情況下,你可能想將每個依賴復制到你構建的產品中(例如,在外部框架中嵌入依賴項,或確保測試包中存在依賴性)。 為此,使用“Framework”目標創建一個新的“Copy Files”構建階段,然后在那里添加框架引用。
升級框架
如果你改動了你的Cartfile,或者你想升級到框架的最新版本(服從于你指定的需求版本),執行carthage update命令可以達到目的。
如果你只是想更新一個或者
如果您只想更新一個或特定的依賴項,在update命令后面使用空格分隔開。例如:
carthage update Box
或者
carthage update Box Result
嵌套依賴關系
如果你想添加到項目中的框架的依賴已經出現在Cartfile 中了,Carthage將會為你自動檢索它們。然后,你必須從Carthage/Build 文件夾將它們自己拖動到你的項目中。
如果項目中的嵌入框架具有對其他框架的依賴性,則必須將它們鏈接到應用程序目標(即使應用程序目標對該框架沒有依賴性,也從不使用它們)。
使用子模塊的依賴關系
通常,Carthage將會直接到你項目的目錄下檢查 依賴的源文件,讓你在選擇時提交或忽略它們。如果你想有依賴項作為Git子模塊(或許這樣你可以提交和推送改變),你可以運行carthage update或者帶有--use-submodules標志的carthage checkout。
當你運行上述命令后,Carthage將.gitmodules和.git/config文件寫入你的存儲庫,并在依賴項的版本更改時自動更新子模塊。
自動重建依賴關系
如果要在開發期間處理依賴項,并希望在構建你的父項目時自動重新構建它們,則可以添加調用Carthage的 Run Script構建階段,如下所示:
/usr/local/bin/carthage build --platform "$PLATFORM_NAME" --project-directory "$SRCROOT"
需要注意的是,在執行此操作之前應該使用子模塊 ,因為不應直接修改 簡單的檢出。
緩存構建
默認地,Carthage將重建一個依賴關系,無論它與以前是否是一樣的解析版本。通過--cache-bulids將會使得carthage去避免重建依賴。有關如何執行此緩存的詳細信息,請參閱有關版本文件的信息 。
注意:此時--cache-builds與--use-submodules不兼容。 使用這兩者將導致工作副本和對子模塊依賴關系的更改提交不能正確重建。See#1785for details
Auto completion of Carthage commands and options are available as documented inBash/Zsh/Fish Completion.
使你的framework支持Carthage
Carthage 正式的只支持動態框架。動態框架在OS X的任何版本都可以使用,但IOS 只能是8或者8+。
因為Carthage沒有集中的包列表,沒有項目規范格式,大多數框架應該自動構建。
任何框架項目的具體要求如下。
分享你的Xcode schemes
Carthage將只從你的.xcodeproj中標記為已分享的Xcode schemes來編譯。如果你想檢查編譯是否成功,執行carthage build --no-skip-current命令,然后檢查Carthage.build文件夾。
如果當執行命令但有scheme沒有被編譯,打開Xcode并確定對應scheme被標記為“Shared”,以便Carthage能夠發現它。
如果你在運行 Carthage build --no-skip-current中遇到構建失敗,請嘗試運行xcodebuild -scheme SCHEME -workspace WORKSPACE build 或 xcodebuild -scheme SCHEME -project PROJECT build(使用實際值),并查看是否發生相同的故障。 這應該有足夠的信息來解決問題。
如果您安裝了多個版本的蘋果開發工具(例如Xcode beta),則使用xcode-selecttor更改Carthage具體使用的版本
通過以上方法仍然解決不了問題,請open an issue,我們很樂意幫助你
標簽穩定版本 (Tag stable releases)
Carthage通過搜索存儲庫中發布的標記來確定框架的哪些版本,并試圖將每個標記名稱解釋為語義版本。例如,在tagv1.2中,語義版本是1.2.0。
沒有任何版本號的標簽或版本號后面的任何字符(例如,1.2-alpha-1)目前不被支持,將被忽略。
如果預先構建的框架已經附加到你的項目庫github發布版本 中或者通過一個二進制項目定義文件,Carthage可以自動地使用預先構建的框架,而不是從頭開始構建。
要為特定標記提供預構建框架,所有被支持的平臺的二進制文件應該一起壓縮到一個歸檔中,并且該歸檔應附加到與該標記相對應的已發布版本。 附件應在其名稱中包括.framework(例如ReactiveCocoa.framework.zip),以向Carthage表明其包含二進制文件。
你可以像下面這樣通過carthage archive命令執行歸檔操作:
carthage bulid --no-skip-current
carthage archive YourFrameworkName
將自動忽略版本草稿,即便它們對應于所需的標簽。
通過使用travis-ci去編譯和上傳你標記的發行版是可行的。
1、通過gem install travis命令安裝travis CLI
2、為您的存儲庫設置 travis-ci(步驟1和2)
3、根據該模板在存儲庫的根目錄中,創建.tarvis.yml文件,
將“FRAMEWORK_NAME”設置為正確的值
替換 PROJECT_PLACEHOLDER 和 SCHEME_PLACEHOLDER
如果使用工作區而不是項目,請刪除xcode_project行,并取消注釋xcode_workspace行。
項目的格式應該是:MyProject.xcodeproj
工作區間的格式應該是:MyWorkspace.xcworkspace
隨時更新xcode_sdk值到另一個SDK,請注意,在iphoneos SDK上的測試將需要你上傳代碼簽名身份。
詳情見travis docs for objective-c projects
language: objective-c
osx_image: xcode7.3
xcode_project:
# xcode_workspace:
xcode_scheme:
xcode_sdk: iphonesimulator9.3
env:
global:
- FRAMEWORK_NAME=
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憑據編碼到.travis.yml文件中,以便讓travis將發行版上傳到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知道在推送新標簽時創建部署,并阻止travis清理生成的zip文件
構建靜態框架以加速應用程序的啟動時間
如果在你的app中嵌入過多的frameworks,他pre-main加載可能會變得相當慢。Carthage可以構建靜態框架來幫助緩解這一問題。靜態框架可以直接鏈接到您的應用程序,或者將其合并到一個更大的動態框架中,并對您的工作流進行一些簡單的修改,這樣可以大幅度減少pre-main加載時間??梢圆榭锤嘞嚓PStaticFrameworks文檔
請注意,這一方法有幾點需要說明:
蘋果沒有正式支持Swift
這是一個先進的工作流,并不是內置在Carthage,YMMV
聲明你的兼容性
想告訴別人你的項目支持Carthage?只需在你的README中添加一個兼容性標記,插入以下的Markdown:
[](https://github.com/Carthage/Carthage)
CarthageKit
大多數carthage命令行工具的功能都封裝在一個名為CarthageKit的框架中。
如果你希望將Carthage作為另一個工具的一部分,或者希望擴展Carthage的功能,可以看看CarthageKit的源碼,檢查API是否符合你的需求。
以上譯文參照完善: