Carthage介紹(譯)

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 updatebrew 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

Bash/Zsh/Fish completion

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能夠發現它。

解決build失敗

如果你在運行 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)目前不被支持,將被忽略。

將預編譯的框架歸檔到一個zip文件中

如果預先構建的框架已經附加到你的項目庫github發布版本 中或者通過一個二進制項目定義文件,Carthage可以自動地使用預先構建的框架,而不是從頭開始構建。

要為特定標記提供預構建框架,所有被支持的平臺的二進制文件應該一起壓縮到一個歸檔中,并且該歸檔應附加到與該標記相對應的已發布版本。 附件應在其名稱中包括.framework(例如ReactiveCocoa.framework.zip),以向Carthage表明其包含二進制文件。

你可以像下面這樣通過carthage archive命令執行歸檔操作:

carthage bulid --no-skip-current

carthage archive YourFrameworkName

將自動忽略版本草稿,即便它們對應于所需的標簽。

使用travis-ci上傳你標記的預構建框架

通過使用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:

[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)

CarthageKit

大多數carthage命令行工具的功能都封裝在一個名為CarthageKit的框架中。

如果你希望將Carthage作為另一個工具的一部分,或者希望擴展Carthage的功能,可以看看CarthageKit的源碼,檢查API是否符合你的需求。


以上譯文參照完善:

指尖彈灰

Carthage:去中心化的Cocoa依賴管理器

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 文檔地址https://github.com/Carthage/Carthage release v0.20.0...
    指尖彈灰閱讀 4,511評論 2 4
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,142評論 4 61
  • 靜態庫與動態庫的區別 首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,010評論 3 42
  • 一個人的成長離不開環境、思維和平臺,我的成長如出一轍。 我們這些60年代出生的,經歷比較多,也算是趕上了好時代。...
    喝酒的鋼鐵漢子閱讀 456評論 0 1
  • 上自習的時候 抬頭發現你喜歡的人正看著你 剛好和你的眼神對上了 是一件多么幸福的事情啊
    vitaCheBIL閱讀 190評論 0 0