剛畢業那段時間接觸到的一些文章處處都在大談iOS工程模塊化(CocoaPods化), 本人也一直在着力於將公司項目代碼解耦合, 可是由於一我的開發實在沒有必要將工程CocoaPods化, 因此遲遲沒有去研究將工程CocoaPods化的方法, 期間本人也抽時間去參加過蘑菇街等平臺舉辦的架構交流會, 現在公司業務發展穩定, 終於有時間將建立公有pod庫
將本身的代碼供其餘開發者pod依賴使用的方法, 以及建立本地/內網的私有Pod庫
供公司項目組件CocoaPods化的方法研究清楚, 把這幾天整理的筆記作個記錄.html
建立公有Pod庫或者私有Pod庫, 實際上原理是同樣的, 都是基於git服務和repo協議, 不同的是, 二者的版本索引查詢方式不同, 公有庫的podspec由CocoaPods/Specs管理, 而內部私有使用的pod庫須要本身創建一個倉庫來管理podspec.ios
正文目錄 一. 建立公有Pod庫 一、註冊CocoaPods帳戶信息 二、建立共享庫文件並上傳到公有倉庫 三、編輯.podspec文件 四、打tag, 發佈一個release版本 五、發佈本身的庫描述文件podspec給cocoapods 六、關於查找和使用新建立的庫 七、更新維護podspec 二. 建立私有Pod庫 一、建立一個git倉庫用來作內部私有庫的Spec Repo 二、建立私有Pod組件庫 三、而後將podspec加入私有Sepc repo中 四、查找和使用內部組件庫
例子: 個人第一個公共pod庫JM_ActionSheet, Podfile中添加pod 'JM_ActionSheet'
便可使用.git
想要建立一個開源pod庫, 首先咱們須要註冊CocoaPods, 這裏使用trunk方式, 做爲一個iOS開發人員你必定安裝了CocoaPods, 那麼只須要在終端執行:github
pod trunk register 郵箱地址 '用戶名' --verbose
這裏咱們通常使用github郵箱和用戶名, 而後在你的郵箱中會收到確認郵件, 在瀏覽器中點擊連接確認即註冊成功, 成功以後能夠終端執行:json
pod trunk me
查看本身的註冊信息, 之後當你有了本身的開源Pod庫, 也能夠用此方式隨時查看本身發佈過的Pods;
segmentfault
共享庫須要三個必不可少的部分:
A. 共享文件夾
(文件夾存放着你要共享的內容, 也就是其餘人pod獲得的文件, .podspec文件中的source_files須要指定此文件路徑及文件類型);
B. LICENSE文件
(默認通常選擇MIT);
C. 庫描述文件.podspec
(本庫的各項信息描述, 須要提交給CocoaPods, pod經過這個文件查找到你共享的庫, .podspec文件的格式見第3點).api
這一步分兩種狀況:
A.若是你已經有了現成的想要共享的文件,你只須要知足上面三個部分,便可上傳到公有倉庫便可繼續其餘的步驟;
B.你想要建立一個全新的工程去作本身的共享, 可使用終端命令:瀏覽器
pod lib create 庫名
去根據須要選擇各項配置後建立一個標準的工程, 這裏不作贅述, 具體請參考:Using Pod Lib Create;服務器
你可使用SourceTree等工具上傳你的代碼到公共倉庫, 關於如何使用命令行上傳代碼到遠端倉庫, 能夠移步:iOS開發使用Git那些事, 這裏不作贅述.架構
以JM_ActionSheet.podspec
爲例:
Pod::Spec.new do |s| s.name = 'JM_ActionSheet' s.version = '1.0.1' s.summary = 'An ActionSheet like WeChat' s.homepage = 'https://github.com/ZJM6658/ActionSheetLikeWeChat' s.license = 'MIT' s.authors = {'JM Zhu' => '815187811@qq.com'} s.platform = :ios, '6.0' s.source = {:git => 'https://github.com/ZJM6658/ActionSheetLikeWeChat.git', :tag => s.version} s.source_files = 'JM_ActionSheet/*.{h,m}' s.requires_arc = true end
這是一個最簡單的.podspec文件樣式, 各項屬性的意思一目瞭然, 若是本庫中有依賴其餘庫, 加上`s.dependency '庫名'
便可.
編寫完成後, 咱們須要驗證.podspec文件的合法性, 這裏須要終端cd到.podspec文件所在文件夾, 執行:
pod lib lint JM_ActionSheet.podspec
若有警告或者錯誤請從新檢查你的編寫正確性, 若是沒有問題會出現
-> JM_ActionSheet (1.0.1) JM_ActionSheet passed validation.
一切準備就緒後, 咱們須要在你的git倉庫裏面存在一個與.podspec文件中一致的version, 這裏你能夠在你的git倉庫中的releases一項去手動發佈, 也能夠在當前文件夾下使用終端命令:
git tag -m 'first release' '1.0.1' git push --tag #推送tag到遠端倉庫
成功以後便可在你的releases裏面看到這個tag的版本.
一樣在這個文件夾下, 終端執行:
pod trunk push JM_ActionSheet.podspec
將你的庫文件.podspec文件提交到公有的specs上面, 這一步作的操做是驗證你的podspec文件是否合法+提交到specs中(等同於fork;commit;push)+將上傳的podspec文件轉成json格式文件),成功後會出現Congrats信息噢~
成功後須要等待的時間不定, 目前通常比較快, 通常使用pod setup和pod search查看是否已經可使用, 本人建立這個庫以後一個星期內天天嘗試pod setup
和pod search JM_ActionSheet
始終沒法查找到本身的庫, 查找資料以後找到解決辦法:
1.pod setup成功後生成的~/Library/Caches/CocoaPods/search_index.json
文件, 是用來查找的索引文件, 終端輸入:
rm ~/Library/Caches/CocoaPods/search_index.json
刪除~/Library/Caches/CocoaPods目錄下的search_index.json文件, 刪除成功後再執行:pod search 庫名
, 等待輸出:Creating search index for spec repo 'master'.. Done! 稍等片刻就會出現你想要的結果~
若是有錯誤或者須要迭代版本,修改工程文件後推送到遠端倉庫後, 須要修改podspec中的版本號, 並從新打tag上傳, 再進行新一輪的驗證和發佈, 固然, 建立一個演示demo工程供其餘開發者下載查看並不會影響咱們的pod庫.
私有Pod庫和公有Pod庫的建立方式沒有什麼區別, 不同的是管理他們的spec repo不同
因此咱們須要本身建立一個跟CocoaPods/Specs相似的倉庫來管理內部建立的Pod庫的podspec文件, 供內部人員更新和依賴使用內部Pod組件庫.
私有repo的構建形式有兩種, 一種是私有git服務器上面建立,一種是本機建立.
本機建立請參考官方文檔:Private Pods,
這裏介紹的是在公司內部搭建的git服務器上面建立整個服務的方式.
在私有服務器一個倉庫,一個用來存放全部共享庫的podspec, 這裏建立好以後的內部SSH協議地址是:git@git.yaomaitong.net:iOSPods/ymtSpecs.git
, 花錢買git的私有倉庫或者使用其餘免費的第三方git服務(如Bitbucket等)建立的私有倉庫給到的http/https地址也同樣.終端輸入命令:
pod repo add ymtSpecs git@git.yaomaitong.net:iOSPods/ymtSpecs.git
將ymtSpecs添加到本地repo, 添加成功後能夠在/.cocoapods/repos/
目錄下能夠看到官方的specs:master和剛剛加入的specs:ymtSpecs
若是有其餘合做人員共同使用這個私有Spec Repo的話在他有對應Git倉庫的權限的前提下執行相同的命令添加這個Spec Repo便可.
繼續建立一個私有倉庫,用來創建須要共享的內部組件, 以Category爲例:git@git.yaomaitong.net:iOSPods/Category.git, 能夠建立示例工程, 像建立公有的庫同樣, 填寫本身的podspec文件
Pod::Spec.new do |s| s.name = 'Category' s.version = '1.0.1' s.summary = 'ymt Category files' s.homepage = 'http://git.yaomaitong.net/iOSPods/Category' s.license = 'MIT' s.authors = {'Gua Pi' => 'guapi@yaomaitong.cn'} s.platform = :ios, '7.0' s.source = {:git => 'http://git.yaomaitong.net/iOSPods/Category.git', :tag => s.version} s.source_files = 'AllCategory/*.{h,m}' s.requires_arc = true end
值得注意的是:podspec文件中的homepage和source不支持ssh協議地址
,因此咱們得放入http/https地址.
與公有庫的建立方式同樣, pod lib lint Category.podspec
驗證成功以後push到倉庫, 而後打tag發佈release版本.
公有庫使用trunk方式將.podspec文件發佈到CocoaPods/Specs, 內部的pod組件庫則是添加到咱們第一步建立的私有Spec repo中去, 在終端執行:
pod repo push ymtSpecs Category.podspec
添加成功以後ymtSpecs中會包含Category庫的podspec信息, 能夠前往~/.cocoapods/repos
下的ymtSpecs文件夾中查看, 同時git服務器中的遠端也更新了.
執行pod search Category
就能查到剛剛建立好的Category庫了, 而後在想要使用此組件的工程的Podfile中加入pod 'Category', '~>1.0.1'
便可使用內部組件啦!
值得注意的是:必須在Podfile前面須要添加你的私有Spec repo的git地址source, pod install時, 才能在私有repo中查找到私有庫, 像這樣:
source 'git@git.yaomaitong.net:iOSPods/ymtSpecs.git' platform :ios, '7.0' target "test" do pod 'Category', '~>1.0.1' end
通過測試, 這種方式能夠把你的全部能夠拆分出來的組件, 甚至是業務都來使用Pod管理, 這樣達到了解耦和單項更新優化某些組件不影響老版本的依賴使用, 出現問題修改Podfile中的依賴版本便可隨時回滾, 給開發了帶來極大的便利, 值得學習.
有同窗表示私有庫與公有庫同時使用有報錯,這個時候你在Podfile中把公有源加上就能夠的:source 'https://github.com/CocoaPods/Specs.git'
參考連接:
CocoaPods Guides
Private Pods
手把手教你發佈代碼到CocoaPods(Trunk方式)
使用Cocoapods建立私有podspec
COCOAPODS建立私有PODS