CocoaPods 大概是 2011 年出現的開源組件管理工具(目前已支持 Objective-C 和 Swift),近年來普及率愈來愈高,幾乎已經是全部 Cocoa 開源項目的標配。另外,不少大點的團隊會用 CocoaPods 拆分工程,實現項目插件化。html
博主曾在 2014 年寫過 CocoaPods 詳解
系列文章:CocoaPods詳解之——使用篇、CocoaPods詳解之——進階篇、CocoaPods詳解之——製做篇,簡單介紹了從使用到親手製做 CocoaPods 開源組件的過程。git
然而隨着時間的推移,CocoaPods 有些使用方式也發生了變化,好比組件提交方式等。本文將從 Trunk 和私有倉庫兩個方面介紹本身對 CocoaPods 的新認識。github
從 CocoaPods 0.33 版本開始,CocoaPods 將組件的提交從 Pull requests 變成了自動化的 Trunk 方式。Trunk 提交方式有如下步驟:json
首次使用 Trunk 時,須要註冊本身的電腦:數組
1
2 |
# pod trunk register [E-mail] [User Name] $ pod trunk register foggry@foggry.com "foggry" |
執行命令之後,上述郵箱會收到一封驗證郵件,按照郵件說明打開制定的連接,註冊流程就完成了。安全
註冊流程完成後,可使用命令:服務器
1
|
$ pod trunk me |
能夠檢驗註冊結果,若是輸出:ide
1
2 3 4 5 6 |
- Name: foggry - Email: foggry@foggry.com - Since: May 19th, 2014 16:03 - Pods: None - Sessions: - March 19th, 22:23 - July 25th, 22:26. IP: 10.1.1.1 |
則說明註冊成功。工具
準備好 podspec 文件後,首先要檢查其合法性:組件化
1
2 |
# Enter podspec path $ pod lib lint |
解決完錯誤和警告後,會顯示如下內容:
1
2 3 |
-> FGMarqueeView (1.0.0) FGMarqueeView passed validation. |
這就說明驗證能夠提交了。
執行提交命令:
1
|
$ pod trunk push WZMarqueeView.podspec |
若是順利的話,會輸出如下內容:
1
2 3 4 5 6 7 8 9 10 11 |
Updating spec repo `master` Validating podspec -> WZMarqueeView (2.0.0) Updating spec repo `master` - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/1f2d70d978843a29cbe17b2476ffed8204eea6ef/Specs/WZMarqueeView/2.0.0/WZMarqueeView.podspec.json - Log messages: - March 21st, 00:49: Push for `WZMarqueeView 2.0.0' initiated. - March 21st, 00:49: Push for `WZMarqueeView 2.0.0' has been pushed (2.327208585 s). |
僅須要這一條命令,開源組件就被推送到 CocoaPods 主倉庫中了。能夠執行如下命令驗證下:
1
|
$ pod search WZMarqueeView |
輸出爲:
1
2 3 4 5 6 |
-> WZMarqueeView (2.0.0) A marquee view used on iOS. pod 'WZMarqueeView', '~> 2.0.0' - Homepage: https://github.com/wangzz/WZMarqueeView - Source: https://github.com/wangzz/WZMarqueeView.git - Versions: 2.0.0, 1.0.0 [master repo] |
說明組件 WZMarqueeView
已經成功從 1.0.0
升級成了 2.0.0
版本。
在執行下述命令時:
1
|
$ pod trunk push WZMarqueeView.podspec |
提示瞭如下錯誤:
1
2 3 4 5 6 |
Updating spec repo `master` Validating podspec -> WZMarqueeView (2.0.0) [!] You are not allowed to push new versions for this pod. |
原來,Trunk 要求只有組件全部者和開發者才能更新已有組件,而上例的組件 WZMarqueeView
是 2014 年經過 Pull requests 方式上傳到 CocoaPods 主倉庫的,並無聲明過全部權。
隨後,到 CocoaPods 指定的網頁:Claim your Pod上填寫對應信息後,按照提示執行命令:
1
|
$ pod trunk info WZMarqueeView |
看到執行結果:
1
2 3 4 5 |
WZMarqueeView - Versions: - 1.0.0 (2014-05-19 22:03:59 UTC) - Owners: - foggry <foggry@foggry.com> |
組件的全部權已經變成了本人,此時再去執行 trunk push
命令時就正常了。
一個組件能夠經過如下命令,添加多個全部者(以郵箱爲標識):
1
2 |
# pod trunk add-owner [Module Name] [Owner E-mail] $ pod trunk add-owner WZMarqueeView kyle@cocoapods.org |
執行成功後,kyle@cocoapods.org
也變成了 WZMarqueeView
的全部者。
對於開發者來講,Pull requests 的操做過程十分繁瑣,須要開源組件製做者先 fork 一份主倉庫,而後將組件提交到 fork 後的倉庫,再 Pull requests 給 CocoaPods 主倉庫的維護者;
對 CocoaPods 主倉庫的維護者來講,須要手工一個個處理主倉庫的合併操做,一般次日甚至須要更長時間 requests 才能被處理;
而 Trunk 方式,開發者只須要一條命令就能將組件上傳到主倉庫,而且 Trunk 方式是自動化的,幾乎再也不須要主倉庫的維護者作任何工做,實時性更好。
另外,Trunk 增長了組件全部者的概念,非全部者沒法提交組件的更新,這在必定程度上提升了 CocoaPods 的安全性。
目前全部支持 CocoaPods 的開源組件,都存儲在 Github 上公共的 CocoaPods Specs 倉庫中,這種方式有如下缺點:
官方倉庫過大,裏面的絕大多數組件都不是咱們須要的,你必定忘不了首次執行 pod install
操做時那無盡的等待;
不能實現私有化,做爲一個至關好用的組件管理工具,不少團隊都使用 CocoaPods 實現龐大項目的組件化,都放在公共倉庫確定不行。
這時就須要建立一個和 CocoaPods Specs 相似的私有組件存儲倉庫。私有倉庫能夠存放在自家公司的 Git 服務器上,也能夠放在各大支持私有倉庫的 Git 平臺上,下面以支持免費私有倉庫的 coding.net爲例說明 CocoaPods 私有倉庫的建立過程。
按照 coding.net 官網提示建立一個私有倉庫便可。
執行如下命令:
1
2 |
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL] $ pod repo add FGSpecs https://git.coding.net/foogry/FGSpecs.git |
將事先準備好的組件添加到倉庫中,組件能夠存放在本地,也能夠放在自家或網上的代碼託管平臺。執行如下命令:
1
2 |
# pod repo push [Private Repo Name] [Private podspec Path] $ pod repo push FGSpecs ~/Desktop/FGMarqueeView.podspec |
執行成功之後,會有如下輸出:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Validating spec -> FGMarqueeView (0.1.0) Updating the `FGSpecs' repo Already up-to-date. Adding the spec to the `FGSpecs' repo - [Fix] FGMarqueeView (0.1.0) Pushing the `FGSpecs' repo To git@git.coding.net:foogry/FGSpecs.git e2ad499..31a1a8e master -> master |
至此,本地和代碼託管平臺上的私有倉庫 FGSpecs 中就都已經添加了私有組件 FGMarqueeView。
Podfile 文件中默認狀況下已經隱式使用 source
聲明瞭 CocoaPods 的官方倉庫。但使用私有組件,須要使用 source
關鍵字鮮顯式聲明組件所在倉庫:
1
2 3 4 5 6 7 8 |
# Private Specs source 'https://git.coding.net/foogry/FGSpecs.git' # Public Specs source 'https://github.com/CocoaPods/Specs.git' pod 'FGMarqueeView', '~> 0.1.0' pod 'SBJson', '~> 4.0.0' |
其中,SBJson 組件是官方倉庫的,FGMarqueeView 組件屬於咱們剛建立的私有倉庫。
須要注意的是:
儘管官方倉庫會被隱式聲明,若是同時使用了官方倉庫和私有倉庫,就須要同時聲明兩者。
先聲明的倉庫具備優先權。當前後引用的兩個倉庫中都包含同一個組件時,會使用先引用倉庫中的,哪怕後引用的倉庫中版本號更高。
若是不想建立私有倉庫,也能夠在 Podfile 裏直接引用私有組件(組件能夠是本地的,也能夠是託管在自家公司服務器或網上的代碼託管平臺上的),引用的同時還能夠制定具體的 commit、branch 或者 tag,好比:
1
|
$ pod 'FGMarqueeView', :git => 'https://git.coding.net/foogry/FGMarqueeView.git', :commit => 'b4dc0ffee' |
這種方式引用的組件在執行完 pod install
之後,會被添加在 Development Pods 目錄下,而經過私有倉庫或共有倉庫方式引用的組件則會被添加在 Pods 目錄下。
cocoapods 升級新版本後可能會遇到坑,所以就有了降級的需求。
1
|
sudo gem list cocoapods |
1
|
sudo gem uninstall cocoapods |
1
|
sudo gem install cocoapods -v 0.39.0 |
轉自:http://foggry.com/blog/2016/03/23/cocoapods-xiang-jie-zhi-geng-xin-pian/