年前在研究使用 CocoaPods 對 iOS 工程組件化,請教了各路大神,基本掌握了使用 CocoaPods 建立公有 Pod 庫和私有 Pod 庫方法。年後,打算正式將項目進行組件化重構,爲了方便整理和學習就整理了這篇文章。html
建立公有 Pod 庫或者私有 Pod 庫,實際上原理是同樣的,都是基於 git 服務和 repo 協議,不同的是,二者的版本索引查詢方式不同,公有庫的 podspec 由 CocoaPods/Specs 管理,而內部私有使用的 pod 庫須要本身創建一個倉庫來管理 podspec。ios
例子: 我有封裝過一個工具CollectionIndexTools,CollectionIndexTools 能夠給 Collection 添加一個相似 TableView 右側的索引條,我想經過 Podfile 中添加 pod 'CollectionIndexToolsLib' 便可使用.git
想要建立一個開源 pod 庫,首先咱們須要註冊 CocoaPods, 這裏使用 trunk 方式,做爲一個 iOS 開發人員你必定安裝了 CocoaPods,那麼只須要在終端執行:github
pod trunk register 郵箱地址 '用戶名' --verbose
複製代碼
這裏咱們通常使用 Github 郵箱和用戶名,而後在你的郵箱中會收到確認郵件,在瀏覽器中點擊連接確認即註冊成功,成功以後能夠終端執行:json
pod trunk me
複製代碼
查看本身的註冊信息,之後當你有了本身的開源Pod庫,也能夠用此方式隨時查看本身發佈過的Pods: swift
共享庫須要三個必不可少的部分:xcode
1.共享文件夾(文件夾存放着你要共享的內容, 也就是其餘人pod獲得的文件, .podspec文件中的source_files須要指定此文件路徑及文件類型);瀏覽器
2.LICENSE文件(默認通常選擇MIT);ruby
3.庫描述文件.podspec(本庫的各項信息描述, 須要提交給CocoaPods, pod經過這個文件查找到你共享的庫, .podspec文件的格式見第3點).bash
這一步分兩種場景:
場景一:若是你已經有了現成的想要共享的文件,你只須要知足上面三個部分,便可上傳到公有倉庫便可繼續其餘的步驟;
場景二:你想要建立一個全新的工程去作本身的共享, 可使用終端命令:
pod lib create CollectionIndexToolsLib
複製代碼
須要輸入一些模板參數:
Cocoapods 會自動生成一個模板項目,目錄結構:
CollectionIndexToolsLib
├── Example #demo APP
│ ├── CollectionIndexToolsLib
│ ├── CollectionIndexToolsLib.xcodeproj
│ ├── CollectionIndexToolsLib.xcworkspace
│ ├── Podfile #demo APP 的依賴描述文件
│ ├── Podfile.lock
│ ├── Pods #demo APP 的依賴文件
│ └── Tests
├── LICENSE #開源協議 默認MIT
├── Pod #組件的目錄
│ ├── Assets #資源文件
│ └── Classes #類文件
├── PodCollectionIndexToolsLib.podspec #第三步要建立的podspec文件
└── README.md #markdown格式的README
複製代碼
以CollectionIndexToolsLib.podspec爲例:
Pod::Spec.new do |s|
s.name = 'CollectionIndexToolsLib'
s.version = '0.1.0'
s.summary = 'Custom IndexTools similar to TableViews index bar'
s.description = <<-DESC I believe you must have thought about adding an index like Table View to Collection View. I will give you one today. DESC
s.homepage = 'https://github.com/ReverseScale/CollectionIndexToolsLib'
s.license = 'MIT'
s.author = { 'ReverseScale' => 'reversescale@icloud.com' }
s.source = { :git => 'https://github.com/ReverseScale/CollectionIndexToolsLib.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'CollectionIndexToolsLib/Classes/**/*'
s.requires_arc = true
end
複製代碼
理論上前面的設置就能夠經過驗證,下面是註釋參照:
Pod::Spec.new do |s|
s.name = "PodTestLibrary" #名稱
s.version = "0.1.0" #版本號
s.summary = "Just Testing." #簡短介紹,下面是詳細介紹
s.description = <<-DESC Testing Private Podspec. * Markdown format. * Don't worry about the indent, we strip it! DESC
s.homepage = "https://coding.net/u/wtlucky/p/podTestLibrary" #主頁,這裏要填寫能夠訪問到的地址,否則驗證不經過
# s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截圖
s.license = 'MIT' #開源協議
s.author = { "wtlucky" => "wtlucky@foxmail.com" } #做者信息
s.source = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" } #項目地址,這裏不支持ssh的地址,驗證不經過,只支持HTTP和HTTPS,最好使用HTTPS
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' #多媒體介紹地址
s.platform = :ios, '7.0' #支持的平臺及版本
s.requires_arc = true #是否使用ARC,若是指定具體文件,則具體的問題使用ARC
s.source_files = 'Pod/Classes/**/*' #代碼源文件地址,**/*表示Classes目錄及其子目錄下全部文件,若是有多個目錄下則用逗號分開,若是須要在項目中分組顯示,這裏也要作相應的設置
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #資源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公開頭文件地址
s.frameworks = 'UIKit' #所需的framework,多個用逗號隔開
s.dependency 'AFNetworking', '~> 2.3' #依賴關係,該項目所依賴的其餘庫,若是有多個須要填寫多個s.dependency
end
複製代碼
編寫完成後, 咱們須要驗證.podspec文件的合法性, 這裏須要終端cd到.podspec文件所在文件夾, 執行: 忽視警告:--allow-warnings
pod lib lint CollectionIndexToolsLib.podspec
複製代碼
若有警告或者錯誤請從新檢查你的編寫正確性,若是沒有問題會出現:
-> CollectionIndexToolsLib (0.1.0)
CollectionIndexToolsLib passed validation.
複製代碼
一切準備就緒後, 咱們須要在你的git倉庫裏面存在一個與.podspec文件中一致的version, 這裏你能夠在你的git倉庫中的releases一項去手動發佈, 也能夠在當前文件夾下使用終端命令:
git tag -m '🔖:Releasing tags.' '0.1.0'
git push --tag #推送tag到遠端倉庫
複製代碼
成功以後便可在你的 releases 裏面看到這個 tag 的版本.
一樣在這個文件夾下, 終端執行: 忽視警告:--allow-warnings
pod trunk push CollectionIndexToolsLib.podspec
複製代碼
將你的庫文件.podspec文件提交到公有的specs上面, 這一步作的操做是驗證你的podspec文件是否合法+提交到specs中(等同於fork;commit;push)+將上傳的podspec文件轉成json格式文件),成功後會出現Congrats信息。
成功上傳後等待片刻就能夠用查找命令找到你的庫:
pod search CollectionIndexToolsLib
複製代碼
若是有錯誤或者須要迭代版本,修改工程文件後推送到遠端倉庫後, 須要修改podspec中的版本號, 並從新打tag上傳, 再進行新一輪的驗證和發佈. 若是在開發過程當中發現某基礎組件存在 bug 須要更新 Pod,具體操做步驟以下:
組件化的實用之處請參考《移動端 iOS 年終工做總結-純乾貨請自備酒水》(juejin.im/post/5a934d…
私有Pod庫和公有Pod庫的建立方式沒有什麼區別, 不同的是管理他們的 spec repo 不同.
因此咱們須要本身建立一個跟CocoaPods/Specs相似的倉庫來管理內部建立的Pod庫的podspec文件, 供內部人員更新和依賴使用內部Pod組件庫.
私有repo的構建形式有兩種, 一種是私有git服務器上面建立,一種是本機建立.
本機建立請參考官方文檔:Private Pods,
這裏介紹的是在公司內部搭建的git服務器上面建立整個服務的方式.
在私有服務器一個倉庫,一個用來存放全部共享庫的podspec, 這裏建立好以後的內部SSH協議地址是:gitee.com/WhatsXie/Li…, 花錢買git的私有倉庫或者使用其餘免費的第三方git服務(如Bitbucket等)建立的私有倉庫給到的http/https地址也同樣.終端輸入命令:
pod repo add LibComponent https://gitee.com/WhatsXie/LibComponent.git
複製代碼
將LibComponent添加到本地repo, 添加成功後能夠在/.cocoapods/repos/目錄下能夠看到官方的specs:master和剛剛加入的specs:LibComponent
若是有其餘合做人員共同使用這個私有Spec Repo的話在他有對應Git倉庫的權限的前提下執行相同的命令添加這個Spec Repo便可.
繼續建立一個私有倉庫,用來創建須要共享的內部組件, 以RSGuidePageLib爲例:gitee.com/WhatsXie/RS… 能夠建立示例工程, 像建立公有的庫同樣, 填寫本身的podspec文件
Pod::Spec.new do |s|
s.name = 'RSGuidePageLib'
s.version = '0.3.0'
s.summary = 'Custom guide page package'
s.description = <<-DESC Swift implementation of the guide page package, support for multiple pictures and video guide page DESC
s.homepage = 'https://gitee.com/WhatsXie/RSGuidePageLib.git'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ReverseScale@icloud.com' => 'reversescale' }
s.source = { :git => 'https://gitee.com/WhatsXie/RSGuidePageLib.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.swift_version = '3.2'
s.source_files = 'RSGuidePageLib/Classes/**/*'
s.requires_arc = true
複製代碼
值得注意的是:podspec文件中的homepage和source不支持ssh協議地址,因此咱們得放入http/https地址.
與公有庫的建立方式同樣, pod lib lint Category.podspec驗證成功以後push到倉庫, 而後打tag發佈release版本.
公有庫使用trunk方式將.podspec文件發佈到CocoaPods/Specs, 內部的pod組件庫則是添加到咱們第一步建立的私有Spec repo中去, 在終端執行: --allow-warnings 忽略警告 --private 私有庫
pod repo push LibComponent RSGuidePageLib.podspec
複製代碼
添加成功以後LibComponent中會包含RSGuidePageLib庫的podspec信息, 能夠前往~/.cocoapods/repos下的LibComponent文件夾中查看, 同時git服務器中的遠端也更新了.
移除私有Repo
pod repo remove [name]
複製代碼
執行pod search Category就能查到剛剛建立好的Category庫了, 而後在想要使用此組件的工程的Podfile中加入pod 'Category', '~>1.0.1'便可使用內部組件啦!
值得注意的是:必須在Podfile前面須要添加你的私有Spec repo的git地址source, pod install時, 才能在私有repo中查找到私有庫, 像這樣:
# Uncomment the next line to define a global platform for your project
source 'https://github.com/CocoaPods/Specs.git'
source 'https://gitee.com/WhatsXie/LibComponent.git'
# platform :ios, '9.0'
target 'Demo' do
pod 'RSGuidePageLib', '~>0.3.0’ end 複製代碼
通過測試, 這種方式能夠把你的全部能夠拆分出來的組件, 甚至是業務都來使用Pod管理, 這樣達到了解耦和單項更新優化。 某些組件不影響老版本的依賴使用, 出現問題修改Podfile中的依賴版本便可隨時回滾, 給開發了帶來極大的便利。