iOS私有Pod, 指南+踩坑
第一次做私有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專案已經有了, 檔案結構如下
把我們的檔案都放到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
這個欄位就有點難受了.我的私有庫結構如下圖
因為我的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 就好了
相關文章
- phppresentation 踩坑指南PHP
- mpvue“踩坑”指南Vue
- ?踩坑指南——onnx系列
- React Native踩坑指南:ios鍵盤遮擋輸入框React NativeiOS
- Druid監控踩坑指南UI
- Realm ios踩坑筆記iOS筆記
- ReactNative 踩坑之 iOS 原生元件ReactiOS元件
- 建立Pod私有庫
- Hexo6 升級踩坑指南Hexo
- 微信小程式踩坑指南【一】微信小程式
- mybatis plus +springboot +jsp整合踩坑指南MyBatisSpring BootJS
- appium IOS 真機踩坑分享 NoSuchElementErrorAPPiOSError
- iOS開發之UIRefreshControl使用踩坑iOSUI
- 分散式配置nacos搭建踩坑指南(下)分散式
- GAMES101 作業7 踩坑指南GAM
- 踩坑指南:入門OpenTenBase之部署篇
- sonarqube配置全指南,sonarqube踩坑記錄
- SM 國密演算法踩坑指南演算法
- Flutter開發環境搭建-踩坑指南Flutter開發環境
- webpack入門及踩坑應對指南Web
- PWA - ios 新增到桌面功能(踩坑之路)iOS
- iOS自動化打包部署踩坑記iOS
- Xcode10和iOS12踩坑XCodeiOS
- 踩坑指南:入門OpenTenBase之監控篇
- React Native踩坑指南:WebView高度自適應React NativeWebView
- vue+vuex+leaflet Jest單測踩坑指南Vue
- 微信小程式mpvue(沒朋友)踩坑指南微信小程式Vue
- 【踩坑指南】執行緒池使用不當的五個坑執行緒
- 使用 Jenkins 配置 iOS 持續整合踩坑實錄JenkinsiOS
- 遊戲人避坑指南——怎樣才能減少踩坑的頻率?遊戲
- Flutter 接入iOS蘋果內購支付踩坑過程FlutteriOS蘋果
- weex踩坑之image圖片在ios/Android不顯示iOSAndroid
- protodep踩坑
- Flutter 踩坑Flutter
- angular踩坑Angular
- CDH踩坑
- vue踩坑Vue
- 相容踩坑