我們通常使用的依賴管理工具是CocoaPods,今天使用新的管理工具Carthage
為什么使用Carthage,非侵入性和去中心化
用過CocoaPods的都知道,CocoaPods對項目的侵入性較高,使用不便,而Carthage 輕耦合,更靈活.同是也是我的嘗鮮之舉
CocoaPods 是存在中心服務器的依賴管理工具,受限于中心服務器的穩(wěn)定性和資源質量, 尤其是網(wǎng)絡環(huán)境較差時比較明顯(當然他的優(yōu)勢也很明顯,資源豐富,維護人員眾多,但是說實話,一個pod的創(chuàng)建還是比較麻煩的)而 Carthage 是去中心化,只依賴于github或者git地址.沒有中心引起的另一個弊端就是: 需要自己去查找資源...
兩種使用體驗,兩種思想體系,如何選擇看自己.
Carthage介紹
Carthage 是由 Swift 語言寫的白翻,只支持動態(tài)框架性锭,只支持 iOS8+坯认。
工作流程:
- 創(chuàng)建一個
Cartfile
文件,寫好依賴哪些框架 - 執(zhí)行
carthage update
,拉取代碼,并且編譯成framework - 把編譯好的
.framework
放到項目中,具體怎么放,后文詳述
目錄結構:
Cartfile
Cartfile.resolved
Carthage
- Build
- iOS
- Alamofire.framework
- Mac
- Alamofire.framework
- Checkouts
- Alamofire
- ...
xxx.xcodeproj
...
開始使用
- 進入指定目錄下,創(chuàng)建一個工程,工程名稱為abc
- 在根目錄創(chuàng)建一個Cartfile 文件
touch Cartfile
- 在Cartfile 文件中寫入
# 最低版本 2.0.3
# github "Mantle/Mantle" >= 2.0.3
# 大于或等于 2.0.3 ,小于 最大版本
# github "realm/realm-cocoa" ~> 2.0.3
# 必須是2.0.3版本
# github "realm/realm-cocoa" == 2.0.3
# 默認使用最新版本
# github "realm/realm-cocoa"
# 使用一個私有項目差购,在 "development" tag中,可以指定git地址,加上指定的tag,引申一下,如果某個工程沒有打tag,是無法使用Carthage的
git "git@10.0.50.71:/home/git/zzjs.git" "ZZContainerPODv2.0.3"
使用
carthage update
更新資源,類似于pod install
在根目錄下產(chǎn)生/Carthage/Build/iOS 中的.framework就是我們需要的
下面到工程中引用這個打好的framework,只需要在對應 Target 中的 Build Setting 中的 Framework Search Path 項加入以下路徑,Xcode 便會自動搜索目錄下的 Framework:
$(SRCROOT)/Carthage/Build/iOS
- 這時運行應該會崩潰,提示信息: image not found,有經(jīng)驗的同學都知道出現(xiàn)這個問題是因為動態(tài)庫, 只有引用找不到代碼導致的,我們在
Build Prases
左上角的+
號,添加New Run Script Phases
,添加內容/usr/local/bin/carthage copy-frameworks
, 在Input Files
中添加$(SRCROOT)/Carthage/Build/iOS/xxx.framework
,運行即可
git 忽略
.gitignore 文件,增加忽略 Carthage 文件夾就行了
使用心得/出現(xiàn)的問題
- 如何進入framework內部進行 單步調試
和framework 同時生成的還有符號文件.dYSM,我們先將文件拷貝到根目錄,然后在Build Phases
不是所有的github庫支持
如何自己尋找可用的庫
首先使用pod search尋找到自己需要的庫,到github上,找到對應的庫,輸入github [github賬號名]/[對應倉庫名] [tag]
例如AFN, 就是github "AFNetworking/AFNetworking"
我自己的庫 就是github "JXwilliamJi/MyCarthage"
如何讓自己的工程支持Carthage
創(chuàng)建一個工程,github 創(chuàng)建一個遠程倉庫,或者在其他git遠程倉庫上創(chuàng)建
創(chuàng)建一個打包framework的 target,名稱就是需要的名稱
Build Phases
中的Compile
中添加所有的.m
文件,在header
中添加.h,調整需要暴露的到public 中到 framework target 的
BuildSettings
的Packaging
中 將Produce Module Name
和Produce Name
修改成需要的名字如果你的工程中包含分類,你需要在
Build Settings
的Linking
的Other Linker Flags
里加上-all_load
選擇
Manager Schemes
, 選擇對應打包framework的target后面的share的勾勾上,如果不打勾,使用Carthage會提示你,沒有分享的target錯誤測試,到Cartfile 同級目錄 輸入
carthage build --no-skip-current
,產(chǎn)生framework 即成功將framework 放到一個新的工程測試,如果一切沒有問題
最后一步,通過git 推送到遠程倉庫中,以后就可以使用了
具體請參考https://github.com/JXwilliamJi/MyCarthage
參考文檔
http://blog.csdn.net/u014599371/article/details/52801263
http://www.cnblogs.com/theswiftworld/p/carthage.html
http://www.isaced.com/post-265.html