Carthage 旨在成為為 Cocoa 應用程式添加框架的最簡單方法。
Carthage 建立您的依賴項並為您提供二進位框架,但您保留對專案結構和設定的完全控制。 Carthage 不會自動修改您的專案檔案或建置設定。
透過執行brew install carthage
取得Carthage 或選擇其他安裝方法
在.xcodeproj
或.xcworkspace
所在的同一目錄中建立一個 Cartfile
在 Cartfile 中列出所需的依賴項,例如:
github "Alamofire/Alamofire" ~> 5.5
運行carthage update --use-xcframeworks
Cartfile.resolved
檔案和Carthage
目錄將會出現在.xcodeproj
或.xcworkspace
所在的同一目錄中
將建置的.xcframework
套件從Carthage/Build
拖曳到應用程式 Xcode 專案的「框架和函式庫」部分。
如果您使用 Carthage 作為應用程序,請選擇“嵌入並簽名”,否則選擇“不嵌入”。
如需深入指南,請閱讀向應用程式新增框架
安裝 Carthage 有多種選項:
安裝程式:下載並執行最新版本的Carthage.pkg
文件,然後按照螢幕上的指示進行操作。如果您透過 CLI 安裝 pkg,則可能需要先執行sudo chown -R $(whoami) /usr/local
。
Homebrew:您可以使用 Homebrew 並透過執行brew update
和brew install carthage
在您的系統上安裝carthage
工具。 (注意:如果您之前安裝了 Carthage 的二進位版本,則應刪除/Library/Frameworks/CarthageKit.framework
)。
MacPorts:您只需執行sudo port selfupdate
和sudo port install carthage
即可使用 MacPorts 並在系統上安裝carthage
工具。 (注意:如果您之前安裝了 Carthage 的二進位版本,則應刪除/Library/Frameworks/CarthageKit.framework
)。
來自原始碼:如果您想運行最新的開發版本(可能非常不穩定或不相容),只需克隆儲存庫的master
分支,然後執行make install
。需要 Xcode 10.0 (Swift 4.2)。
安裝 Carthage 後,您就可以開始為專案新增框架。請注意,Carthage 僅支援動態框架,該框架僅在 iOS 8 或更高版本(或任何版本的 OS X)上可用。
carthage update --use-xcframeworks
。這會將依賴項取得到 Carthage/Checkouts 資料夾中並建置每個依賴項或下載預先編譯的 XCFramework。我們鼓勵從版本 0.37.0(2021 年 1 月)開始使用 XCFrameworks,並且在 Apple Silicon Mac 上建置時需要 XCFrameworks。從離散框架包切換到 XCFrameworks 需要對您的專案進行一些更改:
Carthage/Build
資料夾以刪除任何現有的框架包。carthage build --use-xcframeworks
建構新的 XCFrameworks 。您建立的任何其他參數都可以像平常一樣提供。carthage copy-frameworks
建置階段(如果存在)。Xcode 12+ 不相容:在 Xcode 12 及更高版本中建構框架捆綁包時,不支援多架構平台。更喜歡使用 XCFrameworks 進行構建。如果您需要建立離散框架捆綁包,請使用解決方法 xcconfig 檔案。
carthage update --platform macOS
。這會將依賴項取得到 Carthage/Checkouts 資料夾中並建置每個依賴項或下載預編譯的框架。此外,您還需要複製偵錯符號以在 OS X 上進行偵錯和崩潰報告。
建立一個 Cartfile,其中列出您想要在專案中使用的框架。
運行carthage update
。這會將依賴項取得到 Carthage/Checkouts 資料夾中,然後建置每個依賴項或下載預先編譯的框架。
開啟應用程式目標的常規設定標籤。對於 Xcode 11.0 及更高版本,在「框架、庫和嵌入式內容」部分中,從磁碟上的 Carthage/Build 資料夾中拖放要使用的每個框架。然後,在「嵌入」部分中,從下拉式選單中為新增的每個項目選擇「不嵌入」。對於 Xcode 10.x 及更低版本,在「連結的框架和庫」部分中,從磁碟上的 Carthage/Build 資料夾中拖放要使用的每個框架。
在應用程式目標的「建置階段」設定標籤上,按一下+圖示並選擇「新執行腳本階段」 。建立一個運行腳本,在其中指定您的 shell(例如: /bin/sh
),將以下內容新增至 shell 下面的腳本區域:
/usr/local/bin/carthage copy-frameworks
建立名為input.xcfilelist
的檔案和一個名為output.xcfilelist
的文件
將要使用的框架的路徑新增至input.xcfilelist
。例如:
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveSwift.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
將複製的框架的路徑新增至output.xcfilelist
。例如:
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveSwift.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveCocoa.framework
透過與輸入文件一起指定輸出文件,Xcode 僅需要在輸入文件發生變更或輸出文件遺失時執行腳本。這意味著當您沒有使用 Carthage 重建框架時,髒構建會更快。
將input.xcfilelist
新增至 Carthage 執行腳本階段的「輸入檔案清單」部分
將output.xcfilelist
加入到Carthage運行腳本階段的「輸出檔案清單」部分
此腳本解決了由通用二進位檔案觸發的 App Store 提交錯誤,並確保在存檔時複製必要的位元碼相關檔案和 dSYM。
將偵錯資訊複製到建置的產品目錄中後,每當您在斷點處停止時,Xcode 將能夠對堆疊追蹤進行符號化。這也將使您能夠在調試器中單步執行第三方程式碼。
當歸檔您的應用程式以提交到 App Store 或 TestFlight 時,Xcode 也會將這些檔案複製到應用程式的.xcarchive
套件的 dSYMs 子目錄中。
在此過程中,迦太基將創建一些建構工件。其中最重要的是 Cartfile.resolved 文件,其中列出了為每個框架實際建立的版本。確保提交您的 Cartfile.resolved ,因為使用專案的其他人都需要該檔案來建立相同的框架版本。
您可以新增執行腳本階段,以便在依賴項之一過期時自動向您發出警告。
Build Phases
設定標籤上,按一下+
圖示並選擇New Run Script Phase
。建立一個運行腳本,在其中指定您的 shell(例如: /bin/sh
),將以下內容新增至 shell 下面的腳本區域: /usr/local/bin/carthage outdated --xcode-warnings 2> /dev/null
Carthage 將檢查以確保下載的 Swift(以及混合 Objective-C/Swift)框架是使用本地使用的相同版本的 Swift 建立的。如果版本不匹配,Carthage 將繼續從原始碼建立框架。如果框架不能從原始碼構建,迦太基就會失敗。
由於 Carthage 使用xcrun swift --version
的輸出來確定本機 Swift 版本,因此請確保使用您打算使用的 Swift 工具鏈執行 Carthage 指令。對於許多用例來說,不需要任何額外的操作。但是,例如,如果您使用 Xcode 8.x 建立 Swift 2.3 項目,則為carthage bootstrap
指定預設swift
的一種方法是使用下列命令:
TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage bootstrap
完成上述步驟並推送變更後,專案的其他使用者只需取得儲存庫並執行carthage bootstrap
即可開始使用您新增的框架。
使用 Carthage 處理任意目標的依賴關係與使用 Carthage 處理應用程式非常相似。主要區別在於框架在 Xcode 中的實際設定和連結方式。
由於單元測試目標的常規設定標籤中缺少連結的框架和庫部分,因此您必須將建立的框架拖曳到連結二進位與庫建置階段。
在「建置設定」標籤下的「測試目標」中,將@loader_path/Frameworks
新增至「運行路徑搜尋路徑」(如果尚不存在)。
在極少數情況下,您可能還想將每個相依性複製到建置產品中(例如,將依賴項嵌入到外部框架中,或確保依賴項存在於測試套件中)。為此,請使用框架目標建立新的複製檔案建置階段,然後在其中新增框架參考。您不應該使用carthage copy-frameworks
命令,因為測試包不需要剝離框架,並且不支援運行copy-frameworks
的並發實例(打開並行建置)。
如果您修改了 Cartfile,或想要更新到每個框架的最新版本(根據您指定的要求),只需再次執行carthage update
指令即可。
如果您只想更新一個或特定的依賴項,請將它們作為空格分隔的列表傳遞給update
命令。例如
carthage update Box
或者
carthage update Box Result
重寫了升級框架的邏輯,目的是提高速度並減少記憶體使用。目前它是一項可選功能。可以透過將--new-resolver
傳遞給更新命令來使用它,例如,
carthage update --new-resolver Box
如果您在更新過程中遇到效能問題,請嘗試新的解析器
如果您要新增至專案中的框架具有 Cartfile 中明確列出的依賴項,Carthage 將自動為您檢索它們。然後,您必須自己將它們從 Carthage/Build 資料夾拖曳到您的專案中。
如果專案中的嵌入式框架依賴其他框架,則必須將它們連結到應用程式目標(即使應用程式目標不依賴該框架並且從不使用它們)。
預設情況下,Carthage 會直接將依賴項的來源檔案檢出到您的專案資料夾中,讓您根據自己的選擇提交或忽略它們。如果您希望將依賴項作為 Git 子模組使用(也許這樣您可以提交並推送其中的更改),您可以使用--use-submodules
標誌來運行carthage update
或carthage checkout
。
以這種方式運行時,Carthage 將寫入存儲庫的.gitmodules
和.git/config
文件,並在依賴項的版本更改時自動更新子模組。
如果您想在開發過程中處理依賴項,並希望在建置父專案時自動重建它們,您可以新增一個呼叫 Carthage 的運行腳本建置階段,如下所示:
/usr/local/bin/carthage build --platform " $PLATFORM_NAME " --project-directory " $SRCROOT "
請注意,在執行此操作之前您應該使用子模組,因為不應直接修改普通的簽出。
預設情況下,Carthage 將重建依賴項,無論它是否與先前的解析版本相同。如果可以的話,傳遞--cache-builds
將導致 carthage 避免重建依賴項。有關 Carthage 如何執行此快取的詳細信息,請參閱有關版本文件的資訊。
注意:此時--cache-builds
與--use-submodules
不相容。使用兩者將導致工作副本和對子模組相依性的提交變更無法正確重建。有關詳細信息,請參閱#1785。
可自動完成 Carthage 指令和選項,如 Bash/Zsh/Fish Completion 所述。
Carthage 僅官方支援動態框架。動態框架可以在任何版本的 OS X 上使用,但只能在iOS 8 或更高版本上使用。此外,從 0.30.0 版本開始,Carthage 支援靜態框架。
由於 Carthage 沒有集中的套件列表,也沒有項目規範格式,因此大多數框架應該自動建置。
下面列出了任何框架項目的具體要求。
Carthage 只會建構從.xcodeproj
共享的 Xcode 方案。您可以透過執行carthage build --no-skip-current
,然後檢查 Carthage/Build 資料夾來查看所有預期方案是否都已成功建置。
如果在執行該命令時未建置重要方案,請開啟 Xcode 並確保該方案標記為Shared ,以便 Carthage 可以發現它。
如果您在carthage build --no-skip-current
中遇到建置失敗,請嘗試執行xcodebuild -scheme SCHEME -workspace WORKSPACE build
或xcodebuild -scheme SCHEME -project PROJECT build
(使用實際值)並查看是否出現相同的失敗。這應該會產生足夠的資訊來解決問題。
如果您安裝了多個版本的 Apple 開發人員工具(例如 Xcode beta),請使用xcode-select
變更 Carthage 使用的版本。
如果您仍然無法使用 Carthage 建立框架,請提出問題,我們很樂意為您提供協助!
Carthage 透過搜尋儲存庫上發布的標籤並嘗試將每個標籤名稱解釋為語義版本來確定可用的框架版本。例如,在標籤v1.2
中,語意版本為 1.2.0。
目前不支援不帶任何版本號或版本號後帶有任何字元(例如1.2-alpha-1
)的標籤,並將被忽略。
如果預先建置框架附加到專案儲存庫上的 GitHub 版本或透過二進位專案定義檔附加到,Carthage 可以自動使用預先建置框架,而不是從頭開始建置。
若要為特定標籤提供預先建置框架,所有支援平台的二進位檔案應一起壓縮到一個檔案中,並且該檔案應附加到與該標籤相對應的已發佈版本。附件的名稱中應包含.framework
(例如ReactiveCocoa.framework.zip
),以向 Carthage 表示它包含二進位檔案。存檔的目錄結構是自由形式的,但是框架只能在存檔中出現一次,因為它們將根據其名稱複製到Carthage/Build/<platform>
(例如ReactiveCocoa.framework
)。
要提供預先建構的 XCFrameworks,請使用--use-xcframeworks
進行構建,並遵循相同的流程將所有 XCFrameworks 壓縮到一個檔案中。在附件名稱中包含.xcframework
。從版本 0.38.0 開始,Carthage 更喜歡在傳遞--use-xcframeworks
時下載.xcframework
附件。
您可以使用 carthage 本身執行歸檔操作:
-carthage build --no-skip-current
-carthage archive YourFrameworkName
或替代地
carthage build --archive
草稿版本將被自動忽略,即使它們對應到所需的標籤。
可以使用 travis-ci 來建立和上傳標記的版本。
使用gem install travis
avis 安裝 travis CLI
為您的儲存庫設定 travis-ci(步驟 1 和 2)
根據此範本在儲存庫的根目錄下建立.travis.yml
檔案。將FRAMEWORK_NAME
設定為正確的值。
替換 PROJECT_PLACEHOLDER 和 SCHEME_PLACEHOLDER
如果您使用工作區而不是項目,請刪除 xcode_project 行並取消註解 xcode_workspace 行。
此專案的格式應為:MyProject.xcodeproj
工作區的格式應為:MyWorkspace.xcworkspace
請隨意將xcode_sdk
值更新為另一個 SDK,請注意,在 iphoneos SDK 上進行測試需要您上傳程式碼簽署身份
有關更多信息,您可以訪問 Objective-C 項目的 travis 文檔
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
運行travis setup releases
,按照此處的文件進行操作
此命令會將您的 GitHub 憑證編碼到.travis.yml
檔案中,以便 travis 將版本上傳到 GitHub.com 當提示上傳檔案時,輸入$FRAMEWORK_NAME.framework.zip
更新部署部分以在標籤上運行:
在.travis.yml
中找到:
on :
repo : repo/repo
並加上tags: true
和skip_cleanup: true
:
skip_cleanup : true
on :
repo : repo/repo
tags : true
這將使 travis 知道在推送新標籤時創建部署,並防止 travis 清理生成的 zip 文件
如果您將許多動態框架嵌入到您的應用程式中,則其預主啟動時間可能會相當緩慢。 Carthage 能夠透過將動態框架建構成靜態框架來幫助緩解這種情況。靜態框架可以直接連結到您的應用程式中,也可以透過對工作流程進行一些簡單的修改來合併到更大的動態框架中,這可以顯著減少主啟動前的時間。
自版本 0.30.0 以來,Carthage 專案推出了對用 Swift 或 Objective-C 編寫的靜態連結框架的支持,對此的支持已在 Xcode 9.4 中引入。但請注意,它特別提到了“frameworks” ,因此 Darwin 捆綁了.framework擴展名和內部靜態鏈接的對象檔案。 Carthage 目前不支援靜態庫方案,也沒有計劃在未來引入它們的支援。
工作流程幾乎沒有差別:
然而:
有關詳細信息,請參閱 StaticFrameworks 文件。
請注意,此方法有一些注意事項:
想要宣傳您的專案可以與 Carthage 一起使用嗎?您可以新增相容性徽章:
……到你的README
中,只需插入以下 Markdown 即可:
[ ![ Carthage compatible ] ( https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat )] ( https://github.com/Carthage/Carthage )
無法在建構該框架的其他電腦上使用步驟執行來調試預先建置的框架。只需carthage bootstrap/build/update --no-use-binaries
就可以解決此問題,但有關更自動化的解決方法,請參閱#924。如果您希望 Apple 解決此問題的根本原因,請欺騙 rdar://23551273。
carthage
命令列工具的大部分功能實際上封裝在一個名為 CarthageKit 的框架中。
如果您有興趣使用 Carthage 作為另一個工具的一部分,或者可能擴展 Carthage 的功能,請查看 CarthageKit 原始程式碼,看看該 API 是否滿足您的需求。
CocoaPods 是 Cocoa 的一個長期依賴管理器。那為什麼要建立迦太基呢?
首先,CocoaPods(預設)會自動為您的應用程式和所有相依性建立和更新 Xcode 工作區。 Carthage 使用xcodebuild
建立框架二進位文件,但將整合它們的責任留給了使用者。 CocoaPods 的方法更容易使用,而 Carthage 的方法則靈活且無幹擾。
CocoaPods 的目標在其 README 中列出如下:
…透過創建更集中的生態系統來提高第三方開源程式庫的可發現性和參與度。
相較之下,Carthage 是作為一個去中心化的依賴管理器而創建的。沒有集中的項目列表,這減少了維護工作並避免了任何中心故障點。然而,專案發現更加困難——用戶必須求助於 GitHub 的趨勢頁面或類似頁面。
CocoaPods 專案還必須具有所謂的 podspec 文件,其中包含有關專案的元資料並指定應如何建置它。 Carthage 使用xcodebuild
來建立依賴項,而不是將它們整合到單一工作區中,它沒有類似的規範文件,但您的依賴項必須包含它們自己的 Xcode 項目,該項目描述如何建構其產品。
最終,我們創建了 Carthage,因為我們想要盡可能簡單的工具——一個依賴管理器,它可以完成工作,而無需接管 Xcode 的責任,也無需為框架作者創建額外的工作。 CocoaPods 提供了許多 Carthage 永遠不會擁有的令人驚嘆的功能,但代價是增加了複雜性。
Carthage 是根據 MIT 許可證發布的。
標題背景照片根據 CC BY-NC-SA 2.0 授權發布。理查德·莫特爾的原始照片。