使用 CocoaPods 對公有庫開源和私有庫組件

引言

年前在研究使用 CocoaPods 對 iOS 工程組件化,請教了各路大神,基本掌握了使用 CocoaPods 建立公有 Pod 庫和私有 Pod 庫方法。年後,打算正式將項目進行組件化重構,爲了方便整理和學習就整理了這篇文章。html

AaIDTx.png

建立公有 Pod 庫或者私有 Pod 庫,實際上原理是同樣的,都是基於 git 服務和 repo 協議,不同的是,二者的版本索引查詢方式不同,公有庫的 podspec 由 CocoaPods/Specs 管理,而內部私有使用的 pod 庫須要本身創建一個倉庫來管理 podspec。ios

實用:開源公有庫

例子: 我有封裝過一個工具CollectionIndexTools,CollectionIndexTools 能夠給 Collection 添加一個相似 TableView 右側的索引條,我想經過 Podfile 中添加 pod 'CollectionIndexToolsLib' 便可使用.git

1.註冊 CocoaPods 帳戶信息

想要建立一個開源 pod 庫,首先咱們須要註冊 CocoaPods, 這裏使用 trunk 方式,做爲一個 iOS 開發人員你必定安裝了 CocoaPods,那麼只須要在終端執行:github

pod trunk register 郵箱地址 '用戶名' --verbose
複製代碼

這裏咱們通常使用 Github 郵箱和用戶名,而後在你的郵箱中會收到確認郵件,在瀏覽器中點擊連接確認即註冊成功,成功以後能夠終端執行:json

pod trunk me
複製代碼

查看本身的註冊信息,之後當你有了本身的開源Pod庫,也能夠用此方式隨時查看本身發佈過的Pods: swift

2.建立共享庫文件並上傳到公有倉庫

共享庫須要三個必不可少的部分: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
複製代碼

3.編輯.podspec文件

以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.
複製代碼

4.打tag, 發佈一個release版本

一切準備就緒後, 咱們須要在你的git倉庫裏面存在一個與.podspec文件中一致的version, 這裏你能夠在你的git倉庫中的releases一項去手動發佈, 也能夠在當前文件夾下使用終端命令:

git tag -m '🔖:Releasing tags.' '0.1.0'
git push --tag #推送tag到遠端倉庫
複製代碼

成功以後便可在你的 releases 裏面看到這個 tag 的版本.

5.發佈本身的庫描述文件podspec給cocoapods

一樣在這個文件夾下, 終端執行: 忽視警告:--allow-warnings

pod trunk push CollectionIndexToolsLib.podspec
複製代碼

將你的庫文件.podspec文件提交到公有的specs上面, 這一步作的操做是驗證你的podspec文件是否合法+提交到specs中(等同於fork;commit;push)+將上傳的podspec文件轉成json格式文件),成功後會出現Congrats信息。

成功上傳後等待片刻就能夠用查找命令找到你的庫:

pod search CollectionIndexToolsLib
複製代碼

6.往後維護更新開源庫

若是有錯誤或者須要迭代版本,修改工程文件後推送到遠端倉庫後, 須要修改podspec中的版本號, 並從新打tag上傳, 再進行新一輪的驗證和發佈. 若是在開發過程當中發現某基礎組件存在 bug 須要更新 Pod,具體操做步驟以下:

  • 修改 podspec 文件中的 s.version;
  • 修復 bug 並對項目打 tag,tag 名稱和 s.version 一直並 push 到遠程倉庫。
  • 驗證 podspec 文件的有效性;
  • 推送 podspec 文件到遠程倉庫;
  • 執行 pod search RRCache 驗證結果;

實用:組件化私有庫

組件化的實用之處請參考《移動端 iOS 年終工做總結-純乾貨請自備酒水》(juejin.im/post/5a934d…

私有Pod庫和公有Pod庫的建立方式沒有什麼區別, 不同的是管理他們的 spec repo 不同.

因此咱們須要本身建立一個跟CocoaPods/Specs相似的倉庫來管理內部建立的Pod庫的podspec文件, 供內部人員更新和依賴使用內部Pod組件庫.

私有repo的構建形式有兩種, 一種是私有git服務器上面建立,一種是本機建立.

本機建立請參考官方文檔:Private Pods,

這裏介紹的是在公司內部搭建的git服務器上面建立整個服務的方式.

1.建立一個git倉庫用來作內部私有庫的Spec Repo

在私有服務器一個倉庫,一個用來存放全部共享庫的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便可.

2.建立私有Pod組件庫

繼續建立一個私有倉庫,用來創建須要共享的內部組件, 以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版本.

3.而後將podspec加入私有Sepc repo中

公有庫使用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]
複製代碼

4.查找和使用內部組件庫

執行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中的依賴版本便可隨時回滾, 給開發了帶來極大的便利。

參考連接:

相關文章
相關標籤/搜索