cocoaPods:公有庫私有庫

一、建立依賴庫

依賴庫說白了就是存放第三方代碼的庫,而 cocoapods 本質(zhì)就是第三方庫維護(hù)和導(dǎo)入的便利性工具。依賴庫也叫 pod 庫,一般都是發(fā)布在公共的代碼存放網(wǎng)站上供別人下載和使用,比如 github 上的 AF、MJRefesh等。

而公司中很多時(shí)候并不像泄露代碼,但是又需要使用組件化的框架,這個(gè)時(shí)候就會(huì)把自己的代碼發(fā)布到私有倉庫上,這種 pod 庫一般稱為私有庫。其本質(zhì)和 AF、MJRefesh 等沒有任何區(qū)別,唯一的區(qū)別就是一個(gè)公開,一個(gè)不公開。

1.在git上創(chuàng)建工程

一般而言,依賴庫的建立可以直接使用公開類服務(wù)器如github中的倉庫,也可以是私有服務(wù)器,比如 gitlab。這里使用 gitlab 作為演示


創(chuàng)建依賴庫

2.使用git管理工程

直接使用sourceTree新增一個(gè)倉庫即可:


使用sourceTree拉去依賴庫

3.將代碼上傳到依賴庫中

如果初始化中勾選使用readMe初始化,那么工程中就有一個(gè)README.md文件;
這一步只需要將代碼賦值到改工程中提交即可,這里以修改README.md文件做演示:


update

二、創(chuàng)建spec倉庫

spec 倉庫的概念相當(dāng)于一個(gè)映射,可以理解成商品的清單。因?yàn)?pod 庫會(huì)有很多,每個(gè) pod 庫都會(huì)有一個(gè)自己的代碼存放地址,如果想要導(dǎo)入很多 pod 庫,挨個(gè)在 podfile 上添加地址,這是不現(xiàn)實(shí)的,也很不方便。

spec 倉庫就是存放了所有的 pod 庫的代碼地址和信息,在使用特定的 pod 庫時(shí),直接在這個(gè)倉庫中查找到其對(duì)應(yīng)的代碼下載地址進(jìn)行下載,并根據(jù) pod 庫的一些配置信息進(jìn)行相對(duì)應(yīng)的配置,這些過程全都是自動(dòng)化腳本實(shí)現(xiàn)的,關(guān)鍵文件有:podfile、spec文件、spec倉庫。

我們使用 cocoapods 時(shí),第一次pod update時(shí)都會(huì)下載 spec 倉庫,倉庫很大,所以第一次會(huì)很慢。本質(zhì)就是下載 https://github.com/CocoaPods/Specs
中的內(nèi)容到本地,而且在我們電腦中可以直接找到這個(gè) spec 庫的內(nèi)容,具體地址就不貼出來了,很方便就能找到。

1.在git上創(chuàng)建spec倉庫

這一步和上一步中創(chuàng)建依賴庫是同一個(gè)操作,只是 spec 庫的唯一作用就是用來存儲(chǔ)私有庫對(duì)應(yīng)的spec。在pod時(shí),source 需要設(shè)置spec對(duì)應(yīng)的地址,也就是現(xiàn)在要?jiǎng)?chuàng)建的這個(gè)倉庫的地址。和共有庫(比如AF、SDWebimage等)的唯一區(qū)別就是共有庫的spec文件是存儲(chǔ)在cocoapod的master分支中的,私有庫的spec文件存儲(chǔ)在私有倉庫中;


specRepo

2.使用git管理spec倉庫

同理,使用sourceTree直接拉取,略。

三、依賴庫和spec庫的整合鏈接

1.依賴庫生成spec文件

初始化spec的命令:

pod spec create specName
create spec

2.spec文件的配置

基礎(chǔ)格式:

Pod::Spec.new do |s|
...
end

解釋:
將spec略縮成s來表達(dá)
步驟:
1.填寫基本信息(Spec Metadata)

  s.name         = "XKQuote"
  s.version      = "0.0.1"
  s.summary      = "the summary of Spec."
  s.description  = "description of the Spec."
  s.homepage     = "http://EXAMPLE/XKQuote"

2.Author Metadata

  s.author             = { "caoxk" => "289722789@qq.com" }

備注:這里的作者和郵箱(聯(lián)系方式)必須和下面的License保持一致
3.Spec License
格式:

  s.license      = { :type => "MIT", :file => "LICENSE" }

一般使用MIT License:


create License(1)

create License(2)

創(chuàng)建完成后的樣式:


MIT License

備注:license可以理解成一種版權(quán)信息,甚至可以理解成就是一串單純的字符串,創(chuàng)建方法可以直接創(chuàng)建空文件然后復(fù)制字符串,也可以再gitlab上創(chuàng)建
4.Platform Specifics(平臺(tái)信息)

s.platform     = :ios, "8.0"

  #  When using multiple platforms
  # s.ios.deployment_target = "5.0"
  # s.osx.deployment_target = "10.7"
  # s.watchos.deployment_target = "2.0"
  # s.tvos.deployment_target = "9.0"

5.Source Location(源地址)

  s.source       = { :git => "http://EXAMPLE/XKQuote.git", :tag => "#{s.version}" }

所支持的key:
:git => :tag, :branch, :commit, :submodules
:svn => :folder, :tag, :revision
:hg => :revision
:http => :flatten, :type, :sha256, :sha1
其中,git、svn、hg、http是來源渠道。另外,"url地址",這個(gè)相當(dāng)于是默認(rèn)的key。
我們例子中g(shù)itlab中依賴庫的地址即可填寫:

  s.source       = { :git => "https://gitlab.com/caoxk289722789/xkquote", :tag => "#{s.version}" }

備注:

  • source和homePage沒有關(guān)系。homePage只是作者告訴讀者的一個(gè)非必要性信息(其實(shí)Metadata中最重要的幾個(gè)就是name、version、author)
  • s.version == s.version.to_s ???
    6.Source Code(很重要)
    源文件選項(xiàng),也就是告訴cocoapods你需要復(fù)制到項(xiàng)目中的文件有哪些
    語法:
  // 源文件(要拷貝的文件)
  s.source_files  = "Classes", "Classes/**/*.{h,m}"
  // 排除在外的文件
  s.exclude_files = "Classes/Exclude"
  // 頭文件(如果沒有則會(huì)暴露所有的頭文件,具體怎么用還要再試試)
  s.public_header_files = "Classes/**/*.h"

例子:
文件的結(jié)構(gòu):


source file

寫法:

  s.source_files  = "QLCrashGuardDemo/QLCrashGuardSupportFiles/**/*.{h,m}"

本例子中直接使用README來做演示:


image.png

寫法:

  s.source_files  = "SourceFiles/*.{h,m}"
#s.exclude_files = "Classes/Exclude"
#s.public_header_files = "Classes/**/*.h"

備注:
*:表示所有格式的文件
7.Resources
主要是添加資源文件,比如圖片等
8.Project Linking
主要是添加framework
9.Project Settings(重點(diǎn))
主要是添加依賴

3.驗(yàn)證spec文件

命令:

pod spec lint(需要在對(duì)應(yīng)的路徑下運(yùn)行)

如圖:


image.png

驗(yàn)證后的警告可以不修改,報(bào)錯(cuò)是必須修改的,按照提示修改報(bào)錯(cuò)知道驗(yàn)證通過即可;
通過后的樣式:


image.png

備注
1.添加tag時(shí),要推送到遠(yuǎn)端,不然仍然找不到和version對(duì)應(yīng)的tag
2.及時(shí)推送了tag,有時(shí)候可能是緩存的原因讓然會(huì)導(dǎo)致更新不及時(shí),此時(shí)新增一個(gè)全新的tag再驗(yàn)證即可

按照模板填寫即可
官方文檔:https://guides.cocoapods.org/syntax/podspec.html#social_media_url
幾個(gè)重點(diǎn)地方:

4.添加spec倉庫到本地

這一步就是下載spec倉庫到本地,相當(dāng)于第一次 pod update時(shí),cocoapods會(huì)自動(dòng)下載https://github.com/CocoaPods/Specs
的內(nèi)容到本地,這一次是我們自己手動(dòng)下載我們自己的 spec 索引到本地。

命令:

pod repo add specFileName(給spec倉庫在本地的命名) spec(倉庫的地址)

運(yùn)行命令:

pod repo add XKQuote https://gitlab.com/caoxk289722789/xkquotespec
Cloning spec repo `XKQuote` from `https://gitlab.com/caoxk289722789/xkquotespec`

拉取完成后的目錄是這樣的:


拉取倉庫到本地

注:specFileName 相當(dāng)于一個(gè)文件夾名稱,怎么命名其實(shí)無所謂。cocoapods 的倉庫命名為 master。spec 倉庫的地址就是上一步中新建存放 spec 文件的倉庫地址。

5.將依賴庫的spec文件push到spec倉庫

本地有了 spec 索引,但是其實(shí)這個(gè) spec 索引中還沒有我們即將使用到的私有庫的信息,也就是沒有源代碼的下載地址,這個(gè)時(shí)候需要把我們私有庫的 podspec 文件 push 到 spec 庫中,從而建立索引,這樣我們 pod 的時(shí)候就可以先去 spec 庫中找到這個(gè)私有庫,然后提取里面存儲(chǔ)的私有庫的 podspec 文件,利用文件中的 source 地址下載源碼,并且根據(jù) podspec 文件中的配置命令對(duì)源碼和工程進(jìn)行相應(yīng)的配置,這樣就大功告成,可以使用我們自己的私有庫了。

命令如下:

pod repo push XKQuote(spec repo的名稱) XKQuote.podspec(spec文件名)

添加并push之后會(huì)見到如下效果:


image.png

這里說一下,如果是直接 push 到公有庫,也就是 github 上的 cocopods 的spec 倉庫,直接使用 trunk 命令即可,如下:

pod trunk push XXX.podspec

四、在項(xiàng)目中導(dǎo)入依賴庫

pod

備注:
1.需要添加對(duì)應(yīng)spec repo的地址,不然會(huì)找不到對(duì)應(yīng)的依賴庫
2.pod update之前要確保已經(jīng)add了spec repo

pod成功的結(jié)果:


image.png

五、pod中使用本地路徑:

比如:

    pod 'BaseBusiness', :path => '../../BaseBusiness'

幾個(gè)特性:
1.本地沒有spec repo都沒問題,依據(jù)的是本地path中對(duì)應(yīng)的spec
2.spec不用每次都push,修改后立馬生效
3.直接使用本地的source_files中設(shè)置的文件,不拷貝,會(huì)建立索引,所以在工程中修改后會(huì)影響到源文件,如果有g(shù)it,也會(huì)有g(shù)it關(guān)聯(lián),所以很適合開發(fā)階段來使用。

總結(jié):
cocoapod的本質(zhì)是分為兩個(gè)倉庫,確切的說分為量種倉庫??梢孕蜗蟮睦斫獬珊8壑杏泻芏鄠}庫,一種是存儲(chǔ)貨物的倉庫,而在一個(gè)辦公室里面,有一個(gè)關(guān)于這些貨物信息的清單。依賴庫相當(dāng)于貨物倉庫,spec repo相當(dāng)于清單倉庫。每次pod update,先根據(jù)source下載貨物清單,再根據(jù)pod xxx中具體需要哪種貨物去清單找尋找對(duì)應(yīng)的spec,了解這個(gè)貨物的信息和配置后再進(jìn)行pod,其實(shí)pod的做了什么操作,具體見下一章節(jié)
ios中的project、workspace、libary、framwork

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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