iOS私有Pod, 指南+踩坑

weixin_34162695發表於2018-12-04

第一次做私有Pod, 也是翻遍了網上的教程來學習.
經過自己的實踐, 寫一篇相對詳細的文章吧

文章可能有點亂, 但是文中提到的東西, 基本我都放到文章開頭了. 如果還有哪裡不明白, 可以評論留言.

先說一個小知識, 後面看到可以來檢視

檔案匹配
匹配所有檔案
c
匹配以名字C開頭的檔案
*c匹配以名字c結尾的檔案
c匹配所有名字包含c的檔案
**資料夾以及遞迴子資料夾
?任意一個字元(注意是一個字元)
[set] 匹配多個字元,支援取反
{p,q} 匹配名字包括p 或者 q的檔案

準備工作

  • 請去安裝CocoaPods, 具體過程百度吧....這個不說了
    最簡單的 brew 一下

  • 去程式碼託管平臺建立兩個倉庫
    例如:

私有庫A, 名字叫YYYPodSpecs, 地址https://github.com/YYY/YYYPodSpecs.git

私有庫B, 名字叫YYYPrivatePod, 地址https://github.com/YYY/YYYPrivatePod.git

這裡簡單說一下兩個庫的作用

庫A, 用於存放.podspec檔案的. 這個檔案大概相當於pod的索引吧.具體是什麼, 請google一下.
庫B, 用於存放私有庫程式碼的. 這個沒有什麼值得說的

繼續準備工作

終端, 切換到.cocoapods/repos 資料夾下
cd ~/.cocoapods/repos

繼續執行 pod repo add 資料夾名稱 私有庫A的地址, 如
pod repo add YYYPodSpecs https://github.com/YYY/YYYPodSpecs.git

下面, 注意了, 換路徑了, 換路徑了, 換路徑了

換一個其他的路徑, 比如我們在Document裡面建立我們的私有庫專案
cd ~/Document
pod lib create YYYPrivatePod

然後巴拉巴拉一堆選擇題, 您看著答.

好了, YYYPrivatePod專案已經有了, 檔案結構如下


3358583-927395c522ea855d.png
專案結構1.png

把我們的檔案都放到Classes資料夾下, ReplaceMe.m刪掉

如果檔案都已經放到Classes檔案下, 我們要測試一下正確性等相關事情, 只需要cd 到 Example目錄下, 執行pod update, 然後開啟.xcworkspace即可.

這裡我遇到坑了

坑1
當我們pod update之後, 我們看到的檔案結構, 不一定跟我們製作完後別人pod install 下來的結構一樣. 也就是說, 如果沒有特殊處理, 都是沒有層級的(都在同級)

坑2
如果想pod install後的檔案結構有層級,不同資料夾下的檔案, 不要引用(個人感覺這地方絕對不能引用, 但沒有仔細研究. 深入學習的自行百度一下吧)
例如: Classes裡面有兩個資料夾A和B,
A中有一個類, Aa.h, Aa.m
B中有一個類, Bb.h, Bb.m
Bb.h和.m中不要引入Aa.h

好了, 下面可以編碼了.

編輯.podspec檔案

好了,這個比較重要的地方到來了

Pod::Spec.new do |s|
  s.name             = 'YYYPrivatePod'
  s.version          = '0.0.6'
  s.summary          = 'A Method & Function Kit for YYY'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/YYY/'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'yyy' => 'yyy@xxx.com' }
  s.source           = { :git => 'https://github.com/YYY/YYYPrivatePod.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.source_files = 'YYYPrivatePod/Classes/*.{h}'
  s.public_header_files = 'YYYPrivatePod/Classes/*.{h}'
  s.requires_arc = true
  s.frameworks = 'UIKit', 'Foundation'

  # s.resource_bundles = {
  #  'TKKit' => ['YYYPrivatePod/Assets/*.png', 'Classes/**/*.{nib, storyboard}']
  # }

  # s.dependency 'AFNetworking', '~> 2.3'

  s.subspec 'YYY_CALayer' do |ss|
  ss.source_files = 'YYYPrivatePod/Classes/YYY_CALayer/*'
  ss.public_header_files = 'YYYPrivatePod/Classes/YYY_CALayer/*.h'
  end

  s.subspec 'YYY_Config' do |ss|
  ss.source_files = 'YYYPrivatePod/Classes/YYY_Config/*'
  ss.public_header_files = 'YYYPrivatePod/Classes/YYY_Config/*.h'
  end

  s.subspec 'YYY_Foundation' do |ss|
  ss.source_files = 'YYYPrivatePod/Classes/YYY_Foundation/*'
  ss.public_header_files = 'YYYPrivatePod/Classes/YYY_Foundation/*.h'
  end

  s.subspec 'YYY_UIKit' do |ss|
  ss.source_files = 'YYYPrivatePod/Classes/YYY_UIKit/*'
  ss.public_header_files = 'YYYPrivatePod/Classes/YYY_UIKit/*.h'
  end

end

這是我的.podspec檔案. 下面對幾個比較重要的欄位去說明一下

s.version
這個不要隨便寫, 因為這個欄位的值要和我們提交私有庫程式碼的時候打的tag一致.

s.source
這個欄位就寫YYYPrivatePod倉庫的地址就好了 (https://github.com/YYY/YYYPrivatePod.git)

s.source_files
這個欄位就有點難受了.我的私有庫結構如下圖

3358583-38156c0db141ec69.png
檔案結構2.png

因為我的Classes資料夾下, 只有一個TKKit.h這一個檔案, 其他都是資料夾.我要參與編譯的只有這一個檔案, 所以就不需要用**去遍歷子資料夾了, 並且直接將檔案字尾定死為.h.
此處預設樣式YYYPrivatePod/Classes/**/*( ***代表的什麼, 請在文章開頭處檢視). 如果Classes/**的話, 那麼後面設定的檔案結構都將沒用了, 沒有層級.

s.subspec 'YYY_CALayer' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_CALayer/* '
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_CALayer/*.h'
end
重點來了, 我們要的分級結構, 就是由這些東西來設定的.而不是我們在專案中自己建立資料夾去分級. 寫法照貓畫虎吧. 如果pod install 後發現沒有層級, 仔細檢視這個地方和s.source_files欄位

好了, 比較難過的地方基本就完成了

全部修改好之後, 我們可以在私有庫專案(YYYPrivatePod)目錄中, 終端執行pod lib lint --allow-warnings --verbose
如果.podspec檔案驗證通過, 那就是一行綠字. 驗證失敗就是幾個error, 可以根據日誌去看一下.

當.podspec驗證成功之後, 我們的私有庫的整體工作基本就是完成了, 下面就是提交程式碼, 打tag, 將.podspec上傳到YYYPodSpecs庫中

  • git remote add origin https://github.com/YYY/YYYPrivatePod.git
  • git add .
  • git commit -m "message"
  • git push origin master
  • git tag -m 'v0.0.0' 0.0.0(注意引號外的文字與s.version欄位相同)
  • git push --tags

此時, 我們的私有庫相關程式碼就已經上傳成功了, tag也打完了. 最後一步, 該提交.podspec檔案了

pod repo push YYYPodSpecs YYYPrivatePod.podspec --allow-warnings

此時還會重新校驗.podspec檔案. 如果沒有報錯, 那麼新建一個專案, 在 podfile中的頂部加上
source 'https://github.com/YYY/YYYPodSpecs.git'(管理.podspec的git地址, 此處可以是ssh)

下面正常 pod 就好了

相關文章