年底了可支配的時間逐漸變多了...不愛寫文章的我...也出來遛遛...
在這里用一個自己在項目中編寫的小工具來演示向CocoaPods發(fā)布自己的庫,假設(shè)您已對【git】和【cocoapods】略知一二
操作環(huán)境:Macbook OSX Catalina 10.15.2 (19C57)
一個用于發(fā)送POST、GET請求的簡單網(wǎng)絡(luò)代理協(xié)議:RC_NetworkProxy
一、注冊CocoaPods認證信息
要公開發(fā)布Pod庫需要向CocoaPods trunk注冊身份(設(shè)備)認證信息
pod trunk register your-email@xx.com 'username' --description='some description'
- 郵箱:要替換成自己的郵箱
- 用戶名:可以寫github的用戶名或其它
- 填寫無誤注冊后郵箱會收到一個驗證鏈接,點擊鏈接進行確認:
https://trunk.cocoapods.org/sessions/verify/xxxxx - 注冊成功后,終端輸入命令即可查看自己的注冊信息:
pod trunk me
注冊信息
- Name: 注冊用戶
- Email: 注冊郵箱
- Since: 注冊時間
- Pods:
- RC_NetworkProxy ... 你的提交過的pods
- Sessions:
- 有效日期,注冊ip地址,注冊時輸入的‘description’
二、創(chuàng)建自己的Pod庫
- 先在Github上創(chuàng)建一個倉庫然后克隆到本地,也可以在本地添加遠程倉庫然后推送到Github
- LICENSE文件是必須的
- README文件也是必不可少,你應(yīng)該知道它的作用是什么
2.1 新建倉庫
- 在Github上新建一個倉庫:RC_NetworkProxy
- 克隆倉庫到本地:
git clone https://github.com/Hymn-RoyCHANG/RC_NetworkProxy.git這里使用的是Https的方式克隆,你也可以使用SSH方式
2.2 創(chuàng)建Pod
克隆下來后進入'RC_NetworkProxy'目錄,然后執(zhí)行:
pod spec create RC_NetworkProxy
目錄下會生成 RC_NetworkProxy.podspec文件,然后編輯該文件,我用的Sublime Text編輯的。
(如果使用pod lib create RC_NetworkProxy會根據(jù)pod模板生成一個目錄結(jié)構(gòu)包括、源碼、示例、測試等目錄,這里不做介紹)
2.2.1. 添加源碼文件
源碼工程在其它project編寫,所有這里直接把源碼目錄粘貼過來,后續(xù)可以集成到倉庫里這樣更方便。
當前目錄結(jié)構(gòu)如下:
RC_NetworkProxy
├── LICENSE
├── RC_NetworkProxy
│ ├── RC_NetworkProtocol_Help
│ │ ├── RC_HTTPRequest.h
│ │ ├── RC_HTTPRequest.m
│ │ ├── RC_HTTPResponse.h
│ │ ├── RC_HTTPResponse.m
│ │ ├── RC_JSON.h
│ │ ├── RC_JSON.m
│ │ ├── RC_NetworkProtocol.h
│ │ ├── RC_NetworkProtocol.m
│ │ ├── RC_NetworkProtocol_Help.h
│ │ ├── RC_NetworkProxyDefines.h
│ │ └── RC_NetworkProxyDefines.m
│ ├── RC_NetworkProtocol_Imp
│ │ ├── RC_NetworkProtocol_Imp.h
│ │ └── RC_NetworkProtocol_Imp.m
│ ├── RC_NetworkProxy.h
│ └── RC_NetworkProxy.m
├── RC_NetworkProxy.podspec
└── README.md
隱藏的目錄還有.git、.gitignore
2.2.2 編輯podspec文件
'podspec'文件包含了Pod庫的名字、版本、作者、描述、資源文件、支持平臺版本、依賴庫、許可文件等屬性信息。
其中下面的屬性是必須的:
name:庫名稱
version:版本,必須與倉庫的tag對應(yīng)
author:作者,名字,郵箱等
license:許可文件
homepage:庫的主頁,如果Github上的主頁
source:倉庫的遠程地址,install是這里下載,包括,標簽,分支等
summary:對庫的簡短的描述,最大140個字符
查看podspec文件更多屬性、更多寫法
來個示例:
Pod::Spec.new do |spec|
spec.name = 'RC_NetworkProxy'
spec.version = '0.1.5'
spec.ios.deployment_target = '8.0'
# 倉庫主頁
spec.homepage = 'https://github.com/Hymn-RoyCHANG/RC_NetworkProxy'
spec.license = 'MIT'
# 作者,可以多個
spec.authors = { 'your name' => 'email@xxx.com' }
# install時會根據(jù)git地址和指定的tag去下載代碼
spec.source = {
:git => 'https://github.com/Hymn-RoyCHANG/RC_NetworkProxy.git',
:tag => spec.version
}
spec.summary = 'RC_NetworkProxy is a simple network proxy protocol for sending POST and GET etc.'
# 源文件,把所有要依賴的文件導(dǎo)入進來,這個是物理路徑也就是podspec文件的同級目錄開始查找,可以使用通配符來檢索
spec.source_files = 'RC_NetworkProxy/*.{h,m}'
# 只支持 ARC
spec.requires_arc = true
# 依賴的系統(tǒng)框架
spec.frameworks = 'Foundation'
# 常用的 AFNetworking install下來你會發(fā)現(xiàn)有子目錄,就是通過‘subspec’來實現(xiàn)的
spec.subspec 'RC_NetworkProtocol_Help' do |shelp|
# 源文件
shelp.source_files = 'RC_NetworkProxy/RC_NetworkProtocol_Help/*.{h,m}'
end
spec.subspec 'RC_NetworkProtocol_Imp' do |simp|
# 這個是外部資源依賴,有多個依賴就要寫多個‘dependency’
simp.ios.dependency 'AFNetworking', '~> 3.2.1'
# 這個是依賴的Spec內(nèi)部的子Spec,這個不是物理路徑,相當于內(nèi)部的引用,‘RC_NetworkProxy’ 下的 ‘RC_NetworkProtocol_Help’
simp.ios.dependency 'RC_NetworkProxy/RC_NetworkProtocol_Help'
simp.source_files = 'RC_NetworkProxy/RC_NetworkProtocol_Imp/*.{h,m}'
end
end
- 如果不引入‘subspec’,那么所有‘ spec.source_files’引入的文件在
pod install后將全部放入同一個文件夾‘RC_NetworkProxy’下,對于有潔癖的人來說是無法接受的- 如果使用了‘subspec’就要保證所有‘subspec’不能互相依賴否則無法通過驗證也無法提交的,在設(shè)計編寫代碼時要注意。比如:
shelp.dependency 'RC_NetworkProxy/RC_NetworkProtocol_Imp'
simp.dependency 'RC_NetworkProxy/RC_NetworkProtocol_Help'
--------
這種互相依賴的情況就會報錯:
- ERROR | [iOS] unknown: Encountered an unknown error (There is a circular dependency between RC_NetworkProxy/RC_NetworkProtocol_Imp and RC_NetworkProxy/RC_NetworkProtocol_Help) during validation.- 針對‘podspec’的編寫可以參考其它倉庫的編寫,比如'AFNetworking'、'SDWebImage'等
- 官方建議把沒用的注釋都去掉
2.3 提交到遠程倉庫
到這里準備的差不多了,將本地倉庫目錄下的所有文件推送的遠程:
- 在提交前git需要知道提交人的信息:name和email
如果沒有設(shè)置的話需要設(shè)置一下:
git config --local user.name 'xxxx'git config --local user.email 'xxx@xxx.com'
這是針對當前git倉庫的設(shè)置,如果是全局設(shè)置則 將 '--local' 換成 '--global'
- 提交文件、打版本:
pod add .pod commit -m "your description"git push -u origin master(本地只有master也可以直接推送:git push)git tag 0.1.0,一定要打個tag且要和'podspec'文件中的'version'對應(yīng)git push origin 0.1.0,將tag推送到遠程(推送所有tag:git push --tags)如果不是克隆倉庫到本地則在'push'到遠程倉庫之前需要把本地和遠程關(guān)聯(lián)在一起:
git remote add origin https://github.com/Hymn-RoyCHANG/RC_NetworkProxy.git
然后再'push'和打標簽
2.4 驗證podspec文件
驗證有兩種方式:
-
pod lib lint本地驗證不會聯(lián)網(wǎng) -
pod spec lint本地和遠程驗證,會聯(lián)網(wǎng)
我們是發(fā)布自己的庫到CocoaPods所以使用第二種方式:
pod spec lint RC_NetworkProxy.podspec --allow-warnings --verbose
如果出現(xiàn)podspec的警告或者錯誤則無法通過驗證
- --allow-warnings:忽略所有警告
- --verbose:驗證時的詳細信息,如果有錯誤或者警告會更方便查明原因
如果驗證通過則打印如下:
RC_NetworkProxy.podspec passed validation.
三、發(fā)布Pod庫到CocoaPods
提交所有文件到遠程倉庫、打好tag和驗證無誤后將我們的庫提交給'CocoaPods':
pod trunk push RC_NetworkProxy.podspec
等待一段時間...
Updating spec repo `trunk`
--------------------------------------------------------------------------------
?? Congrats
?? RC_NetworkProxy (0.1.5) successfully published
?? January 9th, 20:43
?? https://cocoapods.org/pods/RC_NetworkProxy
?? Tell your friends!
--------------------------------------------------------------------------------
看到這段文字就說明成功了~~~
如果驗證通過,提交報錯則要看當前的'podspec'文件設(shè)置的版本是不是和之前提交的版本有沖突,如果不是版本問題可以在提交時加上參數(shù)選項查看細節(jié):
pod trunk push RC_NetworkProxy.podspec --allow-warnings --verbose
四、Pod搜索不到
- 提交成功后如果搜索不到,需要執(zhí)行:
git repo update - 如果緩存索引的問題需要刪除該索引:
rm -f ~/Library/Caches/CocoaPods/search_index.json
搜索:
pod search RC_NetworkProxy
-> RC_NetworkProxy (0.1.5)
RC_NetworkProxy is a simple network proxy protocol for sending POST and GET etc.
pod 'RC_NetworkProxy', '~> 0.1.5'
- Homepage: https://github.com/Hymn-RoyCHANG/RC_NetworkProxy
- Source: https://github.com/Hymn-RoyCHANG/RC_NetworkProxy.git
- Versions: 0.1.5, 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0 [trunk repo]
- Subspecs:
- RC_NetworkProxy/RC_NetworkProtocol_Help (0.1.5)
- RC_NetworkProxy/RC_NetworkProtocol_Imp (0.1.5)
五、到這里就完了嗎?
......???