iOS私有Pod, 指南+踩坑

第一次做私有Pod, 也是翻遍了網(wǎng)上的教程來學(xué)習(xí).
經(jīng)過自己的實(shí)踐, 寫一篇相對(duì)詳細(xì)的文章吧

文章可能有點(diǎn)亂, 但是文中提到的東西, 基本我都放到文章開頭了. 如果還有哪里不明白, 可以評(píng)論留言.

先說一個(gè)小知識(shí), 后面看到可以來查看

文件匹配
匹配所有文件
c
匹配以名字C開頭的文件
*c匹配以名字c結(jié)尾的文件
c匹配所有名字包含c的文件
**文件夾以及遞歸子文件夾
?任意一個(gè)字符(注意是一個(gè)字符)
[set] 匹配多個(gè)字符,支持取反
{p,q} 匹配名字包括p 或者 q的文件

準(zhǔn)備工作

  • 請(qǐng)去安裝CocoaPods, 具體過程百度吧....這個(gè)不說了
    最簡(jiǎn)單的 brew 一下

  • 去代碼托管平臺(tái)創(chuàng)建兩個(gè)倉庫
    例如:

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

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

這里簡(jiǎn)單說一下兩個(gè)庫的作用

庫A, 用于存放.podspec文件的. 這個(gè)文件大概相當(dāng)于pod的索引吧.具體是什么, 請(qǐng)google一下.
庫B, 用于存放私有庫代碼的. 這個(gè)沒有什么值得說的

繼續(xù)準(zhǔn)備工作

終端, 切換到.cocoapods/repos 文件夾下
cd ~/.cocoapods/repos

繼續(xù)執(zhí)行 pod repo add 文件夾名稱 私有庫A的地址, 如
pod repo add YYYPodSpecs https://github.com/YYY/YYYPodSpecs.git

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

換一個(gè)其他的路徑, 比如我們?cè)贒ocument里面創(chuàng)建我們的私有庫項(xiàng)目
cd ~/Document
pod lib create YYYPrivatePod

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

好了, YYYPrivatePod項(xiàng)目已經(jīng)有了, 文件結(jié)構(gòu)如下


項(xiàng)目結(jié)構(gòu)1.png

把我們的文件都放到Classes文件夾下, ReplaceMe.m刪掉

如果文件都已經(jīng)放到Classes文件下, 我們要測(cè)試一下正確性等相關(guān)事情, 只需要cd 到 Example目錄下, 執(zhí)行pod update, 然后打開.xcworkspace即可.

這里我遇到坑了

坑1
當(dāng)我們pod update之后, 我們看到的文件結(jié)構(gòu), 不一定跟我們制作完后別人pod install 下來的結(jié)構(gòu)一樣. 也就是說, 如果沒有特殊處理, 都是沒有層級(jí)的(都在同級(jí))

坑2
如果想pod install后的文件結(jié)構(gòu)有層級(jí),不同文件夾下的文件, 不要引用(個(gè)人感覺這地方絕對(duì)不能引用, 但沒有仔細(xì)研究. 深入學(xué)習(xí)的自行百度一下吧)
例如: Classes里面有兩個(gè)文件夾A和B,
A中有一個(gè)類, Aa.h, Aa.m
B中有一個(gè)類, Bb.h, Bb.m
Bb.h和.m中不要引入Aa.h

好了, 下面可以編碼了.

編輯.podspec文件

好了,這個(gè)比較重要的地方到來了

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文件. 下面對(duì)幾個(gè)比較重要的字段去說明一下

s.version
這個(gè)不要隨便寫, 因?yàn)檫@個(gè)字段的值要和我們提交私有庫代碼的時(shí)候打的tag一致.

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

s.source_files
這個(gè)字段就有點(diǎn)難受了.我的私有庫結(jié)構(gòu)如下圖

文件結(jié)構(gòu)2.png

因?yàn)槲业腃lasses文件夾下, 只有一個(gè)TKKit.h這一個(gè)文件, 其他都是文件夾.我要參與編譯的只有這一個(gè)文件, 所以就不需要用**去遍歷子文件夾了, 并且直接將文件后綴定死為.h.
此處默認(rèn)樣式YYYPrivatePod/Classes/**/*( ***代表的什么, 請(qǐng)?jiān)谖恼麻_頭處查看). 如果Classes/**的話, 那么后面設(shè)置的文件結(jié)構(gòu)都將沒用了, 沒有層級(jí).

s.subspec 'YYY_CALayer' do |ss|
ss.source_files = 'YYYPrivatePod/Classes/YYY_CALayer/* '
ss.public_header_files = 'YYYPrivatePod/Classes/YYY_CALayer/*.h'
end
重點(diǎn)來了, 我們要的分級(jí)結(jié)構(gòu), 就是由這些東西來設(shè)置的.而不是我們?cè)陧?xiàng)目中自己創(chuàng)建文件夾去分級(jí). 寫法照貓畫虎吧. 如果pod install 后發(fā)現(xiàn)沒有層級(jí), 仔細(xì)查看這個(gè)地方和s.source_files字段

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

全部修改好之后, 我們可以在私有庫項(xiàng)目(YYYPrivatePod)目錄中, 終端執(zhí)行pod lib lint --allow-warnings --verbose
如果.podspec文件驗(yàn)證通過, 那就是一行綠字. 驗(yàn)證失敗就是幾個(gè)error, 可以根據(jù)日志去看一下.

當(dāng).podspec驗(yàn)證成功之后, 我們的私有庫的整體工作基本就是完成了, 下面就是提交代碼, 打tag, 將.podspec上傳到Y(jié)YYPodSpecs庫中

  • 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(注意引號(hào)外的文字與s.version字段相同)
  • git push --tags

此時(shí), 我們的私有庫相關(guān)代碼就已經(jīng)上傳成功了, tag也打完了. 最后一步, 該提交.podspec文件了

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

此時(shí)還會(huì)重新校驗(yàn).podspec文件. 如果沒有報(bào)錯(cuò), 那么新建一個(gè)項(xiàng)目, 在 podfile中的頂部加上
source 'https://github.com/YYY/YYYPodSpecs.git'(管理.podspec的git地址, 此處可以是ssh)

下面正常 pod 就好了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容