實踐CocoaPods庫的制作

本篇內(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)
image

這是CocoaPods官方用來存放公有庫版本描述文件的倉庫,何為代碼描述文件乔妈?繼續(xù)往下走蝙云,能看到 master 倉庫下深藏玄機(jī)。

image

可以看到目錄下包含了數(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
image

點開郵箱中的鏈接馍乙,頁面顯示如上即為注冊成功布近,此時可在終端查看注冊信息。

$ 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ā)布迭代版本,步驟很簡單逗宜,只需:

  1. 更新 LTVMediaPicker.podspec 中的倉庫版本號
  2. 更新代碼并推送更新到遠(yuǎn)程雄右,同時打上版本號標(biāo)簽
  3. 執(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)建存放代碼描述文件的私有倉庫:

image

創(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)建私有代碼庫

image

添加代碼文件、.podspec文件

  1. 新建一個文件夾LTVGeneral律罢,添加要打包到私有庫的代碼膀值。

  2. 創(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)歷了如下過程:

  1. 根據(jù) podfile 中指定的source路徑拉取版本庫到本地
  2. 從拉取到的版本庫中查找目標(biāo)庫的 .podspec 文件
  3. 根據(jù)查找到的 .podspec 中指定的source路徑拉取代碼卧斟,隨后整合到工程中

現(xiàn)在打開工程殴边,可以看到依賴已經(jīng)安裝了:

image

私有庫的更新

關(guān)于私有庫的更新,其實和公有庫是一樣的流程:

  1. 更新代碼珍语,修改 .podspec 中的版本號锤岸,打上版本標(biāo)簽,推送到遠(yuǎn)程代碼倉庫
  2. 執(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)行探索~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市透乾,隨后出現(xiàn)的幾起案子洪燥,更是在濱河造成了極大的恐慌磕秤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捧韵,死亡現(xiàn)場離奇詭異市咆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)再来,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蒙兰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芒篷,你說我怎么就攤上這事搜变∪纤福” “怎么了内边?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤贰。 經(jīng)常有香客問我篡帕,道長殖侵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任镰烧,我火速辦了婚禮拢军,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怔鳖。我一直安慰自己朴沿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布败砂。 她就那樣靜靜地躺著赌渣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昌犹。 梳的紋絲不亂的頭發(fā)上坚芜,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音斜姥,去河邊找鬼鸿竖。 笑死,一個胖子當(dāng)著我的面吹牛铸敏,可吹牛的內(nèi)容都是我干的缚忧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼杈笔,長吁一口氣:“原來是場噩夢啊……” “哼闪水!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒙具,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤球榆,失蹤者是張志新(化名)和其女友劉穎朽肥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體持钉,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衡招,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了每强。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片始腾。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖空执,靈堂內(nèi)的尸體忽然破棺而出浪箭,到底是詐尸還是另有隱情,我是刑警寧澤脆烟,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布山林,位于F島的核電站房待,受9級特大地震影響邢羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑孩,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一拜鹤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧流椒,春花似錦敏簿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绣硝,卻和暖如春蜻势,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹉胖。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工握玛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甫菠。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓挠铲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寂诱。 傳聞我的和親對象是個殘疾皇子拂苹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容