本篇內(nèi)容基于 CocoaPods V1.6.0 實踐公有庫及私有庫的制作
前言
作為一名iOSer荚虚,我們知道CocoaPods的作用是幫助我們管理和維護(hù)代碼倉庫堂飞。在說具體的如何制作Pod倉庫之前斗这,需要先來了解一下Pods是如何從遠(yuǎn)端拉取代碼的屹电。
~/.cocoapods/repos
安裝了Cocoapods之后陆盘,本地會有這個路徑碧聪,默認(rèn)里面只有一個 master
目錄
.
├── master
這個 master
目錄其實是一個倉庫株汉,在該目錄下執(zhí)行 git remote -v
筐乳,就能看到該目錄關(guān)聯(lián)的遠(yuǎn)端倉庫:
$ git remote -v
origin https://github.com/CocoaPods/Specs.git (fetch)
origin https://github.com/CocoaPods/Specs.git (push)
這是CocoaPods官方用來存放公有庫版本描述文件的倉庫,何為代碼描述文件乔妈?繼續(xù)往下走蝙云,能看到 master
倉庫下深藏玄機(jī)。
可以看到目錄下包含了數(shù)不清的各個版本的公有庫的目錄路召,每個目錄下都有一個 .podspec.json
文件勃刨。這個文件就是所謂的描述文件,里面包含了某個版本的公有庫代碼的具體描述信息股淡,包括代碼源倉庫的路徑身隐、版本號、作者等唯灵。當(dāng)我們執(zhí)行 pod install
需要更新代碼時贾铝,就是根據(jù)該文件下的 source
指定的路徑在拉取源代碼的。
我們在發(fā)布代碼庫時埠帕,不管是公有庫還是私有庫垢揩,都需要兩個倉庫:1.存放源代碼的倉庫 2.存放版本描述文件的倉庫。對于公有庫而言敛瓷,后者就是官方的Specs倉庫叁巨,因此不需要手動創(chuàng)建。并且每次發(fā)布公有庫時琐驴,CocoaPods已經(jīng)給我們提供了相關(guān)的命令來提交描述文件到Specs倉庫上了俘种。而對于私有庫而言,這兩個倉庫則都需要我們手動創(chuàng)建和維護(hù)绝淡。
公有庫
注冊CocoaPods賬號
要想發(fā)布公有庫宙刘,需要注冊CocoaPods,Pods提供了相應(yīng)的注冊命令:
$ pod trunk register EMAIL [YOUR_NAME]
-
EMAIL
:注冊的郵箱 -
YOUR_NAME
:注冊的姓名
執(zhí)行后牢酵,CocoaPods會發(fā)送一份驗證郵件到你指定的郵箱上悬包,登陸郵箱進(jìn)行驗證。
[!] Please verify the session by clicking the link in the verification email that has been sent to youremail
點開郵箱中的鏈接馍乙,頁面顯示如上即為注冊成功布近,此時可在終端查看注冊信息。
$ pod trunk me
顯示如下:
- Name: Lotheve
- Email: gaofeng-7171@163.com
- Since: October 19th, 01:04
- Pods: None
- Sessions:
- October 19th, 01:04 - February 24th, 2019 01:14. IP: 101.71.41.233
創(chuàng)建公有倉庫
倉庫中包含以下文件:
├── LICENSE
├── LTVMediaPicker
├── LTVMediaPicker-Demo
├── LTVMediaPicker.podspec
└── README.md
-
LICENSE
:開源許可證 -
README.md
:庫描述 -
LTVMediaPicker
:庫源碼 -
LTVMediaPicker-Demo
:demo工程丝格,非必須 -
LTVMediaPicker.podspec
:庫描述文件撑瞧,重要!
.podspec描述文件創(chuàng)建
在倉庫目錄下執(zhí)行下面命令即可生成配置文件:
$ pod spec create LTVMediaPicker
生成的文件中包含了很多注釋及默認(rèn)的配置項显蝌,根據(jù)需要整理后如下保留如下配置即可:
Pod::Spec.new do |spec|
# 項目名稱
spec.name = "LTVMediaPicker"
# 版本號
spec.version = "1.0.0"
# 項目簡介
spec.summary = "An media-asset picker from photo album or camera"
# 項目描述
spec.description = <<-DESC
LTVMediaPicker is a simple tool to pick photo or video from album or camera.
DESC
# 項目主頁
spec.homepage = "https://github.com/Lotheve/LTVMediaPicker"
# 開源協(xié)議
spec.license = "MIT"
# 作者
spec.authors = { "Lotheve" => "gaofeng-7171@163.com" }
# 作者主頁
spec.social_media_url = "https://lotheve.github.io/"
# 支持的平臺及版本信息
spec.platform = :ios, "7.0"
# 代碼源地址 需使用https協(xié)議地址
spec.source = { :git => "https://github.com/Lotheve/LTVMediaPicker.git", :tag => "#{spec.version}" }
# 源文件
spec.source_files = "LTVMediaPicker/*.{h,m}"
# 需要鏈接的系統(tǒng)庫
spec.frameworks = 'Foundation', 'UIKit'
# 是否需要ARC支持
spec.requires_arc = true
end
方便起見也可以在官方提供的配置示例上進(jìn)行修改预伺。
校驗.podspec文件格式
$ pod lib lint
驗證通過會提示
-> LTVMediaPicker (1.0.0)
LTVMediaPicker passed validation.
若驗證失敗也會給出相應(yīng)的提示,根據(jù)提示修改即可曼尊。
倉庫提交
.podspec驗證成功后酬诀,即可將倉庫提交到遠(yuǎn)程了,同時需要給提交節(jié)點打上標(biāo)簽骆撇。標(biāo)簽用于穩(wěn)定存儲版本瞒御,要與當(dāng)前配置文件中的 s.version
版本號一致,設(shè)置為 1.0.0
神郊。
$ git push
$ git tag -a 1.0.0 -m '1.0.0版本'
$ git push origin --tags
倉庫發(fā)布
現(xiàn)在肴裙,只需將 .podspec
發(fā)布到公共Specs倉庫中,即可完成倉庫的發(fā)布涌乳。在倉庫目錄下執(zhí)行:
$ pod trunk push LTVMediaPicker.podspec
若提示 You need to register a session first.
践宴,是因為未注冊CocoaPods賬號,需要先注冊爷怀。
這個過程做了如下操作:
- 更新CocoaPods的本地Specs倉庫(這個過程可能等待時間較久)
- 將
.podspec
文件轉(zhuǎn)換為 JSON 格式 - 將本地版本庫的修改推送遠(yuǎn)程Specs倉庫
發(fā)布成功后阻肩,終端會給出如下信息:
--------------------------------------------------------------------
?? Congrats
?? LTVMediaPicker (1.0.0) successfully published
?? October 19th, 01:26
?? https://cocoapods.org/pods/LTVMediaPicker
?? Tell your friends!
--------------------------------------------------------------------
現(xiàn)在,打開 https://cocoapods.org/pods/LTVMediaPicker 就能看到發(fā)布的庫了运授!
倉庫使用
pod庫發(fā)布后烤惊,若執(zhí)行 pod search LTVMediaPicker
搜索不到結(jié)果,提示
[!] Unable to find a pod with name, author, summary, or description matching `LTVMediaPicker`
則需要清楚一下本地搜索索引緩存:
$ pod setup
$ rm ~/Library/Caches/CocoaPods/search_index.json
然后再執(zhí)行
$ pod search LTVMediaPicker
搜索結(jié)果如下:
-> LTVMediaPicker (1.0.0)
An media-asset picker from photo album or camera
pod 'LTVMediaPicker', '~> 1.0.0'
- Homepage: https://github.com/Lotheve/LTVMediaPicker
- Source: https://github.com/Lotheve/LTVMediaPicker.git
- Versions: 1.0.0 [master repo]
然后就可以install了吁朦。
倉庫維護(hù)
當(dāng)公有庫代碼更新后柒室,需要發(fā)布迭代版本,步驟很簡單逗宜,只需:
- 更新
LTVMediaPicker.podspec
中的倉庫版本號 - 更新代碼并推送更新到遠(yuǎn)程雄右,同時打上版本號標(biāo)簽
- 執(zhí)行
pod trunk push LTVMediaPicker.podspec
現(xiàn)在我對LTVMediaPicker做一點小小的修改空骚,代碼不更新,僅是將庫支持的系統(tǒng)最低版本修改為 iOS8.0
spec.platform = :ios, "8.0"
修改后按上述步驟操作擂仍,發(fā)布 1.0.1
版本囤屹。
發(fā)布后再執(zhí)行 pod search LTVMediaPicker
,搜索結(jié)果如下:
-> LTVMediaPicker (1.0.1)
An media-asset picker from photo album or camera
pod 'LTVMediaPicker', '~> 1.0.1'
- Homepage: https://github.com/Lotheve/LTVMediaPicker
- Source: https://github.com/Lotheve/LTVMediaPicker.git
- Versions: 1.0.1, 1.0.0 [master repo]
可以看到 1.0.1
版本已經(jīng)成功發(fā)布了逢渔,或者執(zhí)行 pod trunk info LTVMediaPicker
肋坚,也能看到對應(yīng)的庫信息:
LTVMediaPicker
- Versions:
- 1.0.0 (2018-10-19 07:26:52 UTC)
- 1.0.1 (2018-10-19 11:16:15 UTC)
- Owners:
- Lotheve <gaofeng-7171@163.com>
倉庫版本刪除
pod trunk deprecate [POD REP NAME]
該命令可以使整個庫過期。
pod trunk delete [POD REP NAME] [VERSION]
該命令用來刪除已發(fā)布的指定版本的倉庫肃廓,并且不可回退智厌。一旦刪除,該版本將無法再創(chuàng)建盲赊。
私有庫
創(chuàng)建私有描述文件倉庫
文初提過铣鹏,私有庫的制作需要開辟兩個倉庫,一個是用來存放代碼的哀蘑,另一個是用來存放版本描述文件的(對于公有庫而言吝沫,這個倉庫就是官方的Specs倉庫,對應(yīng)本地 ~/.CocoaPods/repos/
目錄下的 master
倉庫)递礼。既然是私有庫惨险,就要選擇能夠創(chuàng)建私有庫的代碼托管平臺,我這里選擇Coding作為實踐(提供免費(fèi)私有倉庫)脊髓。github自然也是可以創(chuàng)建私有倉庫的辫愉,只不過要收費(fèi)。創(chuàng)建存放代碼描述文件的私有倉庫:
創(chuàng)建成功之后将硝,執(zhí)行
$ pod repo add PrivateRepo git@git.coding.net:lotheve/LTVRepo.git
將遠(yuǎn)程的私有描述文件倉庫關(guān)添加到本地恭朗。這時候再來看 ~/.cocoapods/repos
目錄下的文件:
.
├── PrivateRepo
└── master
發(fā)現(xiàn)本地已經(jīng)增加了 PrivateRepo
目錄,對應(yīng)的就是遠(yuǎn)端的 LTVRepo
倉庫依疼。
后續(xù)若想移除該私有庫痰腮,執(zhí)行下面指令即可:
$ pod repo remove PrivateRepo
創(chuàng)建私有代碼庫
添加代碼文件、.podspec文件
新建一個文件夾LTVGeneral律罢,添加要打包到私有庫的代碼膀值。
-
創(chuàng)建
.podspec
文件$ pod spec create LTVGeneral
此時文件目錄結(jié)構(gòu)如下,其中LTVGeneral下的文件為私有庫代碼文件
.
├── LICENSE
├── LTVGeneral
│ ├── LTVDateTool.h
│ └── LTVDateTool.m
├── LTVGeneral.podspec
└── README.md
修改 .podspec
文件內(nèi)容误辑,按照前面公有庫介紹的模板配置即可:
Pod::Spec.new do |spec|
# 項目名稱
spec.name = "LTVGeneral"
# 版本號
spec.version = "1.0.0"
# 項目簡介
spec.summary = "A private code library"
# 項目主頁
spec.homepage = "https://coding.net/u/lotheve/p/LTVGeneral"
# 開源協(xié)議
spec.license = "MIT"
# 作者
spec.authors = { "Lotheve" => "gaofeng-7171@163.com" }
# 支持的平臺及版本信息
spec.platform = :ios, "8.0"
# 代碼源地址
spec.source = { :git => "git@git.coding.net:lotheve/LTVGeneral.git", :tag => "#{spec.version}" }
#spec.source = { :git => "https://git.coding.net/lotheve/LTVGeneral.git", :tag => "#{spec.version}" }
# 源文件
spec.source_files = "LTVGeneral/*.{h,m}"
# 需要鏈接的系統(tǒng)庫
spec.frameworks = 'Foundation', 'UIKit'
# 是否需要ARC支持
spec.requires_arc = true
end
然后驗證倉庫配置的正確性
$ pod lib lint
這時報了一個警告:
- WARN | source: Git SSH URLs will NOT work for people behind firewalls configured to only allow HTTP, therefore HTTPS is preferred.
[!] LTVGeneral did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it).
說是source不建議用git協(xié)議沧踏。其實這里用git協(xié)議或者h(yuǎn)ttps協(xié)議的地址都可以,只是使用前者時巾钉,團(tuán)隊其他成員安裝私有庫依賴還需要先在代碼倉庫上部署公鑰翘狱,這有助于進(jìn)一步控制團(tuán)隊內(nèi)的“私有”(如果你確定有這必要的話)。若確定使用git協(xié)議砰苍,指令后面加上 --allow-warnings
參數(shù)即可忽略警告潦匈。此處我選擇https阱高,修改配置:
#spec.source = { :git => "git@git.coding.net:lotheve/LTVGeneral.git", :tag => "#{spec.version}" }
spec.source = { :git => "https://git.coding.net/lotheve/LTVGeneral.git", :tag => "#{spec.version}" }
再次驗證,輸出驗證通過(LTVGeneral passed validation)茬缩。
推送代碼和描述文件
現(xiàn)在赤惊,可以把代碼推送到遠(yuǎn)程了,記得打上版本標(biāo)簽
$ git push
$ git tag -a 1.0.0 -m '1.0.0版本'
$ git push origin --tags
接下來寒屯,推送版本描述文件到遠(yuǎn)程倉庫,命令如下:
$ pod repo push PrivateRepo LTVGeneral.podspec
這個過程經(jīng)歷了如下步驟:
-
Validating spec
驗證
.podspec
文件 -
Updating the 'PrivateRepo' repo
更新本地版本描述文件倉庫
-
Adding the spec to the 'PrivateRepo' repo
添加新的描述文件到本地描述文件倉庫中
-
Pushing the 'PrivateRepo' repo
推送本地描述文件倉庫的修改到遠(yuǎn)程
這時候進(jìn)到本地Pods目錄下黍少,查看PrivateRepo的內(nèi)容如下:
├── LICENSE
├── LTVGeneral
│ └── 1.0.0
│ └── LTVGeneral.podspec
└── README.md
可以看到1.0.0版本的LTVGeneral描述文件已經(jīng)存在了寡夹。
工程安裝私有庫
首先search一下私有庫看下:
$ pod search LTVGeneral
-> LTVGeneral (1.0.0)
A private code library
pod 'LTVGeneral', '~> 1.0.0'
- Homepage: https://coding.net/u/lotheve/p/LTVGeneral
- Source: https://git.coding.net/lotheve/LTVGeneral.git
- Versions: 1.0.0 [PrivateRepo repo]
沒問題。
現(xiàn)在厂置,在先前的測試工程的 Podfile
中添加 pod 'LTVGeneral', '~> 1.0.0'
來準(zhǔn)備安裝私有庫菩掏。然后執(zhí)行 pod install
, 可以看到如下報錯:
[!] Unable to find a specification for `LTVGeneral (~> 1.0.0)`
這是因為CocoaPods默認(rèn)從官方的Specs倉庫中查找目標(biāo)庫的信息,若要從私有庫中查找昵济,需要在 Podfile
中指定源地址智绸。如果是安裝私有庫的同時,還要安裝公有庫访忿,那么公有庫的版本倉庫地址也要顯式加上瞧栗。修改后的 Podfile
文件如下:
source 'https://git.coding.net/lotheve/LTVRepo.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'testProject' do
pod 'LTVMediaPicker', '~> 1.0.0'
pod 'LTVGeneral', '~> 1.0.0'
end
需要注意的是source指定的是版本描述文件的倉庫地址,而非代碼庫的倉庫地址海铆。隨后再次執(zhí)行 pod install
迹恐,即可安裝成功。pod install
經(jīng)歷了如下過程:
- 根據(jù)
podfile
中指定的source路徑拉取版本庫到本地 - 從拉取到的版本庫中查找目標(biāo)庫的
.podspec
文件 - 根據(jù)查找到的
.podspec
中指定的source路徑拉取代碼卧斟,隨后整合到工程中
現(xiàn)在打開工程殴边,可以看到依賴已經(jīng)安裝了:
私有庫的更新
關(guān)于私有庫的更新,其實和公有庫是一樣的流程:
- 更新代碼珍语,修改
.podspec
中的版本號锤岸,打上版本標(biāo)簽,推送到遠(yuǎn)程代碼倉庫 - 執(zhí)行
pod repo push PrivateRepo LTVGeneral.podspec
發(fā)布新版本
結(jié)語
通過對公有庫制作和私有庫制作的實踐板乙,相信大家(包括我本人)對CocoaPods的理解更透徹了是偷。實際上對于一些體量較小的工程而言,大多會使用CocoaPods接入一些三方公有庫募逞,當(dāng)然也有不少公司維護(hù)內(nèi)部的私有組件庫來實現(xiàn)快速開發(fā)晓猛。而對于一些大工程而言,則能夠充分利用CocoaPods的私有庫能力來實現(xiàn)工程的組件化凡辱,實現(xiàn)模塊之間的解耦戒职。接下來我將對工程組件化進(jìn)行探索~