CocoaPods 知識(shí)

CocoaPods 知識(shí)

  • 目錄
    • 前言
    • CocoaPods安裝
    • CocoaPods原理
    • CocoaPods使用

1、 前言

CocoaPods是OS X和iOS下的一個(gè)第三類庫(kù)管理工具龄毡,通過CocoaPods工具我們可以為項(xiàng)目添加被稱為“Pods”的依賴庫(kù)(這些類庫(kù)必須是CocoaPods本身所支持的)想诅,并且可以輕松管理其版本召庞。

相關(guān)資料

2、 CocoaPods安裝

1来破、設(shè)置 ruby 源

Mac 系統(tǒng)自帶的會(huì)安裝好 ruby 環(huán)境

1.1篮灼、查看自己電腦的 ruby 源

  • ruby -v
ruby -v
  • 如果自己電腦版本低于這個(gè)版本就升級(jí) ruby ,上面顯示我的電腦版本不需要升級(jí)徘禁,可以忽略下面的升級(jí)操作
sudo gem update --system
  • 要是沒有ruby環(huán)境, 執(zhí)行下面的指令
gem install ruby 

1.2诅诱、更換 ruby 鏡像

  • ruby 默認(rèn)的原地址是國(guó)外網(wǎng)絡(luò)地址,通過下面命令查看當(dāng)前的鏡像
gem sources -l

*** CURRENT SOURCES ***

https://rubygems.org/
  • 移除當(dāng)前鏡像
gem sources --remove https://rubygems.org/

https://rubygems.org/ removed from sources
  • 添加國(guó)內(nèi)的 ruby 鏡像
gem sources -a https://gems.ruby-china.com/
https://gems.ruby-china.com/ added to sources
  • 再次查看當(dāng)前鏡像,發(fā)現(xiàn)已經(jīng)替換成功
gem sources -l
*** CURRENT SOURCES ***

https://gems.ruby-china.com/

2送朱、安裝 CocoaPods

ruby 環(huán)境安裝后娘荡,就可以安裝 CocoaPods 了

2.1 檢查pod版本

pod --version

2.2 卸載CocoaPods

#卸載
sudo gem uninstall cocoapods 

#卸載指定版本
sudo gem uninstall cocoapods -v 1.9.3

2.3 安裝

方法一
#下載最新版本
sudo gem install cocoapods 

#下載指定版本
sudo gem install cocoapods -v 1.9.3

等待了幾分鐘后干旁,顯示下面的信息,便表示已經(jīng)安裝成功了炮沐。

方法二
sudo gem install -n /usr/local/bin cocoapods

2.2 檢測(cè)是否安裝成功

  • 可以通過檢查pod版本指令查看是否安裝成功
pod --version

2.3 下載文件

pod setup

2.4 驗(yàn)證安裝成功與否

pod search AFNetworking

3争群、 CocoaPods原理

核心組件

CocoaPods 是一個(gè) objc 的依賴管理工具,而其本身是利用 ruby 的依賴管理 gem 進(jìn)行構(gòu)建的大年。

CocoaPods是用 Ruby 寫的换薄,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的。在解析整合過程中翔试,最重要的幾個(gè) gems 分別是:

  • CocoaPods/Specs
  • CocoaPods/CocoaPods
  • CocoaPods/Core
  • CocoaPods/Xcodeproj

CocoaPods/Specs

這個(gè)是一個(gè)保存第三方組件 podspec 文件的倉(cāng)庫(kù)轻要。第三方組件開發(fā)完成之后,會(huì)傳一份 podspec 文件傳到 CocoaPods垦缅,這個(gè) Specs 包含了每個(gè)第三方組件所有版本的 podspec 文件伦腐。當(dāng)使用某個(gè)第三方組件時(shí),如果這些組件支持 CocoaPods失都,會(huì)在 Podfile 中指定 source,例如下面這樣:

source 'https://github.com/CocoaPods/Specs.git'

當(dāng)執(zhí)行 pod install 或 pod update 等一些命令時(shí)幸冻,便會(huì)從這個(gè)倉(cāng)庫(kù)找到組件指定版本的 podspec 文件粹庞,然后根據(jù)這個(gè) podspec 配置信息去獲取組件。

CocoaPods/CocoaPod

這是是一個(gè)面向用戶的組件洽损,每當(dāng)執(zhí)行一個(gè) pod 命令時(shí)庞溜,這個(gè)組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能碑定,并且還能通過調(diào)用所有其它的 gems 來(lái)執(zhí)行任務(wù)流码。

CocoaPods/Core Core

組件提供支持與 CocoaPods 相關(guān)文件的處理,文件主要是 Podfile 和 podspecs延刘。

當(dāng)執(zhí)行 pod install等一些命令時(shí)漫试。Core組件會(huì)解析第三方組件開發(fā)者上傳的podspec文件和使用者的podfile,以此確定需要為project引入哪些文件。除此之外碘赖,當(dāng)執(zhí)行與這些文件一些相關(guān)的命令時(shí)驾荣,也由這部分組件處理,例如使用 pod spec lint 來(lái)檢測(cè) podspec 文件的有效性普泡。

CocoaPods/Xcodeproj

這個(gè) gem 組件負(fù)責(zé)所有工程文件的整合播掷。它能夠?qū)?chuàng)建并修改 .xcodeproj 和 .xcworkspace 文件。它也可以作為單獨(dú)的一個(gè) gem 包使用撼班。如果你想要寫一個(gè)腳本來(lái)方便的修改工程文件歧匈,那么可以使用這個(gè) gem。

Podfile

Podfile 是一個(gè)文件砰嘁,用于定義項(xiàng)目所需要使用的第三方庫(kù)件炉。該文件支持高度定制勘究,你可以根據(jù)個(gè)人喜好對(duì)其做出定制。

Podspec

.podspec 也是一個(gè)文件妻率,該文件描述了一個(gè)庫(kù)是怎樣被添加到工程中的乱顾。它支持的功能有:列出源文件、framework宫静、編譯選項(xiàng)和某個(gè)庫(kù)所需要的依賴等走净。

Ruby 概述

方法

  • 簡(jiǎn)單的方法
    Ruby 代碼在調(diào)用方法時(shí)可以省略括號(hào)。
def method_name (var1=value1, var2=value2)
  expr..
end

ruby中的方法以'def'開頭孤里,以'end'作為結(jié)尾伏伯,我們可以為參數(shù)設(shè)置默認(rèn)值,如果方法調(diào)用時(shí)未傳遞必需的參數(shù)則使用默認(rèn)值捌袜,上例中的value1和value2就是默認(rèn)值说搅。

  • 可變數(shù)量的參數(shù)
def sample (*test)
  puts "參數(shù)個(gè)數(shù)為 #{test.length}"
  for i in 0...test.length
    puts "參數(shù)值為 #{test[I]}"
  end
end
sample "Zara", "6", "F"。

數(shù)據(jù)類型--Hash

哈希(Hash)是類似 "key" => "value" 這樣的鍵值對(duì)集合虏等。哈希類似于一個(gè)數(shù)組弄唧,只不過它的索引(或者叫"鍵")不局限于使用數(shù)字,Hash 的索引幾乎可以是任何對(duì)象霍衫。

Hash 雖然和數(shù)組類似候引,但卻有一個(gè)很重要的區(qū)別:Hash 的元素沒有特定的順序。 如果順序很重要的話就要使用數(shù)組了敦跌。

pod 'SwViewCapture', :git=>'git@github.com:startry/SwViewCapture.git', :branch=>'master'
def pod(name = nil, *requirements)
  unless name
    raise StandardError, 'A dependency requires a name.'
  end

  current_target_definition.store_pod(name, *requirements)
end

pod方法后面跟著的參數(shù)就是一個(gè)Hash的對(duì)象澄干,寫成key-value的形式就是

{
  ":git": "git@github.com:startry/SwViewCapture.git",
  ":branch": "'master'"
}

block

Ruby中do ~end之間的部分稱為塊,也可以寫為{..}
所以這個(gè)target方法可以以這種形式調(diào)用:

target('PodSample') {
  pod('SDWebImage', '~> 4.4.2')
}

也可以使用我們常見的形式調(diào)用:

target('PodSample') do
  pod('SDWebImage', '~> 4.4.2')
end

eval

這個(gè)方法會(huì)將字符串當(dāng)做代碼來(lái)執(zhí)行,也就是說 eval 模糊了代碼與數(shù)據(jù)之間的邊界柠傍,iOS開發(fā)過程中也會(huì)使用eval執(zhí)行js代碼麸俘。

 eval "1 + 2 * 3" => 7

Podfile&Podfile.lock的解析

Podfile

CocoaPods內(nèi)部定義了一些配置方法,把方法參數(shù)轉(zhuǎn)化為內(nèi)部Hash變量的屬性惧笛。

Podfile.lock

Podfile.lock文件是用數(shù)據(jù)描述語(yǔ)言YAML編寫的从媚,YAML(YAML Ain’t Markup)是一種簡(jiǎn)潔的非標(biāo)記語(yǔ)言,以數(shù)據(jù)為中心患整,使用空白静檬,縮進(jìn),分行組織數(shù)據(jù)并级,從而使得表示更加簡(jiǎn)潔易讀拂檩,其可以與json互轉(zhuǎn),CocoaPods內(nèi)部是把Podfile.lock文件解析成Hash類型嘲碧,從而進(jìn)行參數(shù)數(shù)據(jù)查詢和與Podfile文件中的參數(shù)進(jìn)行對(duì)比稻励。

4、CocoaPods使用

image.png
  • 遠(yuǎn)程 pods 庫(kù):
    • 可以是CocoaPods 公共庫(kù),也可以是一個(gè)自定義的 Git 倉(cāng)庫(kù)(遠(yuǎn)程私有庫(kù))
  • 本地索引庫(kù):
    • 位置可以通過命令$cd ~/.cocoapods/repos進(jìn)入.公共庫(kù)和私有庫(kù)都會(huì)在該路徑下
  • 源代碼庫(kù):
    • 可以是CocoaPods公共Git倉(cāng)庫(kù)中的庫(kù),也可以用任何一個(gè)Git, Mercurial或者SVN倉(cāng)庫(kù)取代望抽,并且還可以指定具體的commit, branch或者tag加矛。

基礎(chǔ)

1. 創(chuàng)建Podfile文件

#進(jìn)入項(xiàng)目根路徑中執(zhí)行,生成Podfile文件(如果有Podfile文件不用執(zhí)行pod init)
pod init

說明:Podfile文件詳細(xì)描述了一個(gè)或多個(gè)工程中targets的依賴關(guān)系

2. Podfile添加第三方庫(kù)依賴

target 'QSAppDemo' do
  pod 'AFNetworking'
  pod 'YYModel', '~> 1.0.4'
end

3. 下載和安裝第三方庫(kù)

pod install
  • 下載成功后煤篙,使用CocoaPods 生成的 .xcworkspace 文件來(lái)打開工程斟览;每次更改了 Podfile 文件,要重新執(zhí)行一次pod update命令;
  • 發(fā)生執(zhí)行pod install或pod update都卡在Analyzing dependencies的情況辑奈,是因?yàn)橐?jí)CocoaPods的spec倉(cāng)庫(kù)苛茂,命令后添加--verbose --no-repo-update 參數(shù)可以省略此步。

pod指定依賴項(xiàng)版本范圍

  • 如果依賴項(xiàng)后不指定版本鸠窗,默認(rèn)取最新版本
  pod 'AFNetworking'

版本控制

> 0.1 高于0.1版本(不包含0.1版本)的任意一個(gè)版本
>= 0.1 高于0.1版本(包含0.1版本)的任意一個(gè)版本
< 0.1 低于0.1版本(不包含0.1版本)的任意一個(gè)
<= 0.1低于0.1版本(包含0.1版本)的任意一個(gè)
~> 0.1.2 版本 0.1.2的版本到0.2 妓羊,不包括0.2。這個(gè)基于你指定的版本號(hào)的最后一個(gè)部分稍计。這個(gè)例子等效于>= 0.1.2并且 <0.2.0躁绸,并且始終是你指定范圍內(nèi)的最新版本。

pod制定依賴庫(kù)的分支或節(jié)點(diǎn)

  • 引入master分支(默認(rèn))
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
  • 引入指定的分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'develop'
  • 引入某個(gè)節(jié)點(diǎn)的代碼
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '2.7.0'
  • 引入某個(gè)特殊的提交節(jié)點(diǎn)
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '685e31a31bb1ebce3fdb5a752e392dfd8263e169'
  • 使用本地文件

我們也可以指定依賴庫(kù)的來(lái)源地址臣嚣。如果我們想引入我們本地的一個(gè)庫(kù)净刮,可以這樣寫:

pod 'AFNetworking', :path => '~/Documents/AFNetworking'

關(guān)于Podfile中一些配置說明

Source:

指定pod的來(lái)源。如果不指定source硅则,默認(rèn)是使用CocoaPods官方的source

# 使用官方默認(rèn)地址(默認(rèn))
source 'https://github.com/CocoaPods/Specs.git'

# 公司私有庫(kù)
source '私有庫(kù)url'

Target configuration (目標(biāo)項(xiàng)配置)

platform用于指定應(yīng)建立的靜態(tài)庫(kù)的平臺(tái)淹父。CocoaPods提供了默認(rèn)的平臺(tái)版本配置:

#指定具體平臺(tái)和版本
platform :ios, '4.0'
platform :iOS

use_frameworks!:

使用此命令會(huì)在Pods工程下的Frameworks目錄下生成依賴庫(kù)的framework,如果不使用抢埋,會(huì)在Pods工程下的Products目錄下生成.a的靜態(tài)庫(kù)。

target 'Demo' do
  use_frameworks!
end

Dependencies(依賴項(xiàng))

Podfile指定每個(gè)target的依賴項(xiàng)

pod指定特定的依賴庫(kù)

podspec可以提供一個(gè)API來(lái)創(chuàng)建podspecs

target通過target指定依賴范圍

target

在給定的塊內(nèi)定義pod的target(Xcode工程中的target)和指定依賴的范圍督暂。一個(gè)target應(yīng)該與Xcode工程的target有關(guān)聯(lián)揪垄。默認(rèn)情況下,target會(huì)包含定義在塊外的依賴逻翁,除非指定不使用inherit!來(lái)繼承(說的是嵌套的塊里的繼承問題)

定義一個(gè)Apptarget僅引入AFNetworking庫(kù)饥努,定義AppTeststarget 引入Nimble的同時(shí)也會(huì)繼承Apptarget里面的AFNetworking庫(kù)

target 'App' do 
  pod 'AFNetworking' 
  target 'AppTests' do
    inherit! :search_paths 
    pod 'Nimble' 
  end
end
  • target塊中嵌套多個(gè)子塊
target 'ShowsApp' do
    # ShowsApp 僅僅引入ShowsKit
    pod 'ShowsKit' 
    # 引入 ShowsKit 和 ShowTVAuth 
    target 'ShowsTV' do 
        pod 'ShowTVAuth' 
    end 
    # 引入了Specta和Expecta以及ShowsKit
    target 'ShowsTests' do 
        inherit! :search_paths 
        pod 'Specta' 
        pod 'Expecta' 
    end
end
  • 抽象target

定義一個(gè)新的抽象目標(biāo),它可以方便的用于目標(biāo)依賴?yán)^承八回。

簡(jiǎn)單寫法

abstract_target 'Networking' do
    pod 'AlamoFire' 
    target 'Networking App 1' 
    target 'Networking App 2'
end

定義一種abstract_target包含多個(gè)target

# 注意:這是個(gè)抽象的target也就是說在工程中并沒有這個(gè)target引入ShowsKit
abstract_target 'Shows' do
    pod 'ShowsKit'
    # ShowsiOS target會(huì)引入ShowWebAuth庫(kù)以及繼承自Shows的ShowsKit庫(kù)
    target 'ShowsiOS' do
        pod 'ShowWebAuth'
    end
    # ShowsTV target會(huì)引入ShowTVAuth庫(kù)以及繼承自Shows的ShowsKit庫(kù)
    target 'ShowsTV' do
        pod 'ShowTVAuth'
    end
    # ShowsTests target引入了Specta和Expecta庫(kù)酷愧,并且指明繼承Shows,所以也會(huì)引入ShowsKit
    target 'ShowsTests' do
        inherit! :search_paths 
        pod 'Specta' 
        pod 'Expecta' 
    end
end

Build configurations(編譯配置)

默認(rèn)情況下缠诅, 依賴項(xiàng)會(huì)被安裝在所有target的build configuration中溶浴。為了調(diào)試或者處于其他原因,依賴項(xiàng)只能在給定的build configuration中被啟用管引。

下面寫法指明只有在Debug和Beta模式下才有啟用配置

pod 'MJRefresh', :configurations => ['Debug', 'Beta']

或者士败,可以弄白名單只指定一個(gè)build configurations。

pod 'MJRefresh', :configuration => 'Debug'

注意:默認(rèn)情況下如果不指定具體生成配置,那么會(huì)包含在所有的配置中谅将,如果你想具體指定就必須手動(dòng)指明漾狼。

Subspecs

一般情況我們會(huì)通過依賴庫(kù)的名稱來(lái)引入,cocoapods會(huì)默認(rèn)安裝依賴庫(kù)的所有內(nèi)容饥臂。

我們也可以指定安裝具體依賴庫(kù)的某個(gè)子模塊逊躁,例如:

# 僅安裝QueryKit庫(kù)下的Attribute模塊
pod 'QueryKit/Attribute'
# 僅安裝QueryKit下的Attribute和QuerySet模塊
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']

def

我們還可以通過def命令來(lái)聲明一個(gè)pod集:

def 'CustomPods'
   pod 'IQKeyboardManagerSwift'
end 

然后,我們就可以在需要引入的target處引入:

target 'MyTarget' do 
   CustomPods
end 

這么寫的好處是:如果有多個(gè)target隅熙,而不同target之間并不全包含稽煤,那么可以通過這種方式來(lái)分開引入。

post_install

當(dāng)我們安裝完成猛们,但是生成的工程還沒有寫入磁盤之時(shí)念脯,我們可以指定要執(zhí)行的操作。

比如弯淘,我們可以在寫入磁盤之前绿店,修改一些工程的配置:

post_install do |installer| installer.pods_project.targets.each do |target| 
        target.build_configurations.each do |config| 
            config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported' 
        end 
    end
end

pre_install

當(dāng)我們下載完成,但是還沒有安裝之時(shí)庐橙,可以使用hook機(jī)制通過pre_install指定要做更改假勿,更改完之后進(jìn)入安裝階段。

pre_install do |installer| 
    # 做一些安裝之前的更改
end

abstract! 和 inherit!

  • abstract! 指示當(dāng)前的target是抽象的态鳖,因此不會(huì)直接鏈接Xcode target转培。

  • inherit! 設(shè)置當(dāng)前target的繼承模式。例如:

target 'App' do
   target 'AppTests' do
      inherit! :search_paths 
   end
end

inhibit_all_warnings!

inhibit_all_warnings! 屏蔽所有來(lái)自于cocoapods依賴庫(kù)的警告浆竭。你可以全局定義浸须,也能在子target里面定義,也可以指定某一個(gè)庫(kù):

# 隱藏SSZipArchive的警告而不隱藏ShowTVAuth的警告
pod 'SSZipArchive', :inhibit_warnings => true
pod 'ShowTVAuth', :inhibit_warnings => false

5邦泄、CocoaPods創(chuàng)建私有庫(kù)

CocoaPods拉取開源庫(kù)的原理:

CocoaPods 有一個(gè)開源的索引倉(cāng)庫(kù)Specs删窒,倉(cāng)庫(kù)存放著所有開源庫(kù)的各個(gè)版本的.podspec文件,.podspec文件包含中記錄著源碼的地址顺囊。首次使用CocoaPods時(shí)肌索,會(huì)將這個(gè)文件庫(kù)克隆到本地~/.cocoapods/repos/master。

  1. 在Podfile目錄下執(zhí)行 pod install 命令特碳,會(huì)從本地的索引庫(kù)查找該庫(kù)的.podsepc诚亚,如果本地不存在會(huì)從遠(yuǎn)程拉取最新的索引庫(kù)。
  2. 根據(jù)索引庫(kù)中查到的.podspec文件內(nèi)容午乓,獲取源碼地址站宗。
  3. 從源碼地址拉取對(duì)應(yīng)版本的代碼。

使用是可以發(fā)現(xiàn)益愈,首次導(dǎo)入一個(gè)開源庫(kù)時(shí)速度較慢份乒,之后再導(dǎo)入時(shí)會(huì)很快。是因?yàn)镃ocoaPods在本地會(huì)有一個(gè)緩存目錄,存放開源庫(kù)的源碼或辖,首次下載后瘾英,再次導(dǎo)入該庫(kù)時(shí),會(huì)直接從本地復(fù)制過去颂暇。

查看緩存列表使用pod cache list,緩存路徑為~/Library/Caches/CocoaPods/Pods/缺谴。

創(chuàng)建私有庫(kù)步驟:

1. 創(chuàng)建podspec文件

1.1 什么是podspec?文件夾打開~/.cocoapods/repos看到
image.png

specs存放的就是cocoapod官網(wǎng)庫(kù)的specification:說明書耳鸯,通過這個(gè)podspec文件里的信息湿蛔,找到對(duì)應(yīng)資源URL,然后clone到我們的pod中县爬⊙羯叮可以理解為書的目錄,我們查找第三方庫(kù)的時(shí)候?qū)嶋H就是查找這個(gè)specs集合财喳。所以我們創(chuàng)建私有庫(kù)第一步就是創(chuàng)建我們的spec察迟,目錄。

先創(chuàng)建空的repository,為了區(qū)分命名最好以spec為后綴耳高,說明這是存說明書的庫(kù)

然后將這個(gè)庫(kù)添加到~/.cocoapods/repos中扎瓶,操作很簡(jiǎn)單,終端執(zhí)行pod命令pod repo add hxkSpec git@github.com:xiaoyiqiu/spec.git

1.2 開始創(chuàng)建私有庫(kù)podspec泌枪,理解為pod私有庫(kù)說明書

在github上創(chuàng)建一個(gè)存放specification的倉(cāng)庫(kù)概荷,注意不是存放源碼的庫(kù),一定不要搞錯(cuò)了

image.png

我建議先創(chuàng)建空的repository,為了區(qū)分命名最好以spec為后綴,說明這是存說明書的庫(kù)

然后將這個(gè)庫(kù)添加到~/.cocoapods/repos中,操作很簡(jiǎn)單顷蟆,終端執(zhí)行pod命令pod repo add TDNIMKitSpec git@github.com:strivever/TDNIMKitSpec.git

命令格式:

pod repo add 【specName】 【spec遠(yuǎn)程倉(cāng)庫(kù)地址】

2.制作我們的pod庫(kù)

2.1 創(chuàng)建庫(kù)

pod lib create 【你的pod庫(kù)名】

2.2 配置.Podspec文件信息

Podspec文件語(yǔ)法

Pod::Spec.new do |s|
  #pod私有庫(kù)名稱
  s.name             = 'TDNIMKit'
  #pod私有庫(kù)版本號(hào)
  s.version          = '0.1.0'
  #pod私有庫(kù)概要
  s.summary          = 'A short description of TDNIMKit.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC
  #主要,最好能訪問
  s.homepage         = 'https://github.com/458362366@qq.com/TDNIMKit'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  #開源協(xié)議
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  #開源作者
  s.author           = 'Striver'
  #源碼地址愈捅,clone時(shí)候就需要使用這個(gè)地址跟版本拉取
  s.source           = { :git => 'https://github.com/458362366@qq.com/TDNIMKit.git', :tag =>'0.1.0' }
  #支持的系統(tǒng)版本
  s.ios.deployment_target = '8.0'
  #源碼相對(duì)路徑
  s.source_files = 'TDNIMKit/Classes/**/*'
  
  # s.resource_bundles = {
  #   'TDNIMKit' => ['TDNIMKit/Assets/*.png']
  # }
  # s.public_header_files = 'Pod/Classes/**/*.h'
  #需要使用的框架
  # s.frameworks = 'UIKit', 'MapKit'
  #依賴的其它第三方庫(kù)
  # s.dependency 'AFNetworking', '~> 2.3'
end

  • cd到源碼的文件夾中:
pod lib lint --sources=git@github.com:xiaoyiqiu/spec.git,https://github.com/CocoaPods/Specs.git --allow-warnings
pod repo push spec huang.podspec --sources=git@github.com:xiaoyiqiu/spec.git,https://github.com/CocoaPods/Specs.git --allow-warnings

2.3 驗(yàn)證庫(kù)有沒問題

進(jìn)行本地驗(yàn)證podspec文件是否正了

cd 到xxx.podspec目錄:執(zhí)行以下指令

pod lib lint --use-libraries --allow-warnings

2.4 編寫代碼

2.5 上傳到gitLab托管平臺(tái)

  • 上傳到遠(yuǎn)程服務(wù)器
  • 一定要打上tag值. 需要跟podspec文件中指定的tag一致
  • 將podsepec中的 source填入倉(cāng)庫(kù)地址 上傳到倉(cāng)庫(kù)記得看一下遠(yuǎn)程倉(cāng)庫(kù)資源是否被同步上去了,不然一會(huì)校驗(yàn)會(huì)出現(xiàn)資源匹配不到叠殷。

2.6 遠(yuǎn)程倉(cāng)庫(kù)驗(yàn)證

  • 方法一(推薦):
pod lib lint --sources=【gitLab ssh地址】,https://github.com/CocoaPods/Specs.git --allow-warnings


pod lib lint --sources=git@github.com:xiaoyiqiu/spec.git(遠(yuǎn)程庫(kù)的地址),https://github.com/CocoaPods/Specs.git --allow-warnings
  • 方法二:
pod spec lint --use-libraries --allow-warnings

驗(yàn)證可能很漫長(zhǎng)改鲫,可以增加 --verbose查看日志

2.6 發(fā)布私有庫(kù)

執(zhí)行以下發(fā)布指令:

  • 方法一:
// pod 命令: 
pod repo push spec huang.podspec 【本地spec文件夾名稱】【需要發(fā)布的.podspec文件 --sources=【gitLab ssh地址】,https://github.com/CocoaPods/Specs.git --allow-warnings

pod repo push spec huang.podspec --sources=git@github.com:xiaoyiqiu/spec.git,https://github.com/CocoaPods/Specs.git --allow-warnings
  • 方法二:
pod命令 pod repo push 【本地spec文件夾名稱】【需要發(fā)布的.podspec文件】--use-libraries --allow-warnings --verbose
  • 發(fā)布成功后查看一下本地和遠(yuǎn)程應(yīng)該都有了podspec

2.7 驗(yàn)證私有倉(cāng)庫(kù)是否可用

  • 用pod命令進(jìn)行搜索诈皿,看能否搜索到:$ pod search [私有庫(kù)名字]
  • 如果搜索不到林束,在終端執(zhí)行如下命令rm ~/Library/Caches/CocoaPods/search_index.json或者更新本地倉(cāng)庫(kù) pod repo update然后重新search

2.8 使用私有庫(kù)

6、常用pod指令

pod setup原理

本質(zhì)就是將 https://github.com/CocoaPods/Specs 上的項(xiàng)目克隆到/Users/用戶名/.cocoapods/repos目錄下稽亏,若此目錄下已經(jīng)有這個(gè)項(xiàng)目壶冒,使用pod setup命令則會(huì)將項(xiàng)目更新到最新的狀態(tài)。

pod instal和pod update的區(qū)別

  • 執(zhí)行pod install時(shí)截歉,如果Podfile.lock文件存在, 則下載Podfile.lock文件中指定的版本安裝胖腾,對(duì)于不在Podfile.lock文件中的pod庫(kù),pod install命令會(huì)搜索這個(gè)pod庫(kù)在Podfile文件中指定的版本來(lái)安裝;

  • 當(dāng)你想要更新pod庫(kù)的版本時(shí)才使用pod update咸作;它不管Podfile.lock是否存在, 都會(huì)讀取Podfile文件的的框架信息去下載安裝锨阿,下載好之后, 再根據(jù)下載好的框架信息, 生成Podfile.lock文件

//生成Podfile文件,編寫需要的第三方文件
$ pod init 
//安裝第三方庫(kù)记罚,安裝成功會(huì)生成`podfile.lock`文件用來(lái)記錄第三方庫(kù)版本墅诡,
后面接上--no--repo--install 的意思是不更新本地索引庫(kù)
$ pod install 
$ pod install --no--repo--install
//更新第三方庫(kù)為本地索引庫(kù)最新版本,后面接上--no--repo--update的意思是不更新本地索引庫(kù)
$ pod update 
$ pod update --no--repo--update
//搜索當(dāng)前本地索引倉(cāng)庫(kù)中對(duì)應(yīng)的第三方庫(kù)
$ pod search 第三方庫(kù)名稱
//查看當(dāng)前版本
$pod --version
//更新本地所有索引庫(kù) 桐智,更新指定索引庫(kù)接上索引庫(kù)名稱即可
$ pod repo update
//通過pod查看已添加的 repo
$ pod repo list

清除相關(guān)命令

#查看本地pod緩存
pod cache list

#清除某個(gè)庫(kù)緩存
pod cache clean xxxx

# 清除所有pod緩存
pod cache clean -all

#刪除緩存方法
rm ~/Library/Caches/Cocoapods/Pods/Pods/Release

其他

# 刪除 search_index.json 文件
rm  ~/Library/Caches/CocoaPods/search_index.json
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末末早,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子说庭,更是在濱河造成了極大的恐慌然磷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊驴,死亡現(xiàn)場(chǎng)離奇詭異姿搜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缺脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門痪欲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人攻礼,你說我怎么就攤上這事业踢。” “怎么了礁扮?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵知举,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我太伊,道長(zhǎng)雇锡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任僚焦,我火速辦了婚禮锰提,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芳悲。我一直安慰自己立肘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布名扛。 她就那樣靜靜地躺著谅年,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肮韧。 梳的紋絲不亂的頭發(fā)上融蹂,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天旺订,我揣著相機(jī)與錄音,去河邊找鬼超燃。 笑死区拳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的意乓。 我是一名探鬼主播劳闹,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洽瞬!你這毒婦竟也來(lái)了本涕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伙窃,失蹤者是張志新(化名)和其女友劉穎菩颖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體为障,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晦闰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳍怨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呻右。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞋喇,靈堂內(nèi)的尸體忽然破棺而出声滥,到底是詐尸還是另有隱情,我是刑警寧澤侦香,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布落塑,位于F島的核電站,受9級(jí)特大地震影響罐韩,放射性物質(zhì)發(fā)生泄漏憾赁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一散吵、第九天 我趴在偏房一處隱蔽的房頂上張望龙考。 院中可真熱鬧,春花似錦矾睦、人聲如沸晦款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柬赐。三九已至亡问,卻和暖如春官紫,著一層夾襖步出監(jiān)牢的瞬間肛宋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工束世, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酝陈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓毁涉,卻偏偏與公主長(zhǎng)得像沉帮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贫堰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354