cocoapods

http://events.jianshu.io/p/8c2a54f61f2d

一:前言

iOS開發(fā)會(huì)經(jīng)常用到cocoapods管理第三方,簡(jiǎn)單、方便、高效。如何集成cocoapods在cocoapods官網(wǎng)和Podfile語(yǔ)法說明會(huì)有詳細(xì)介紹,本想介紹的是關(guān)于集成cocoapods時(shí)會(huì)用到的一個(gè)文件Podfile文件。

二: 什么是Podfile

Podfile是一個(gè)規(guī)范,描述了一個(gè)或多個(gè)一套工程目標(biāo)的依賴項(xiàng)。

1,一個(gè)簡(jiǎn)單寫法:

target'MyApp'dopod'AFNetworking','~> 3.0'end

這是最簡(jiǎn)單最普遍的寫法,針對(duì)MyApp這個(gè)target引入AFNetworking這個(gè)依賴庫(kù),也是大家平時(shí)用的最多的一種方式。

2,下面是個(gè)更復(fù)雜的一個(gè)例子:

下面兩行是指明依賴庫(kù)的來源地址

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

說明平臺(tái)是ios,版本是9.0

platform:ios,'9.0'

忽略引入庫(kù)的所有警告(強(qiáng)迫癥者的福音啊)

inhibit_all_warnings!

針對(duì)MyApp target引入AFNetworking

針對(duì)MyAppTests target引入OCMock

target'MyApp'dopod'AFNetworking','~> 3.0'target'MyAppTests'doinherit!:search_pathspod'OCMock','~> 2.0.1'endend

這個(gè)是cocoapods的一些配置,官網(wǎng)并沒有太詳細(xì)的說明,一般采取默認(rèn)就好了,也就是不寫.

post_installdo|installer|installer.pods_project.targets.eachdo|target|puts target.nameendend

三:主配置

install! 這個(gè)命令是cocoapods聲明的一個(gè)安裝命令,用于安裝引入Podfile里面的依賴庫(kù)。

install! 這個(gè)命令還有一些個(gè)人設(shè)置選項(xiàng),例如:

install!'cocoapods',:deterministic_uuids=>false,:integrate_targets=>false

還支持其他的選項(xiàng):

SupportedKeys::clean:deduplicate_targets:deterministic_uuids:integrate_targets:lock_pod_sources:share_schemes_for_development_pods

Dependencies(依賴項(xiàng))

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

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

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

target通過target指定依賴范圍

pod - 指定項(xiàng)目的依賴項(xiàng)

依賴項(xiàng)規(guī)范是由Pod的名稱和一個(gè)可選的版本組合一起。

如果后面不寫依賴庫(kù)的具體版本號(hào),那么cocoapods會(huì)默認(rèn)選取最新版本。

pod 'SSZipArchive'

如果你想要特定的依賴庫(kù)的版本,就需要在后面寫上具體版本號(hào),格式:

pod 'Objection', '0.9'

也可以指定版本范圍

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)的最新版本。

關(guān)于版本形式規(guī)范詳情請(qǐng)參考下面鏈接:語(yǔ)義化版本:https://semver.org/lang/zh-CN/

Build configurations(編譯配置)

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

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

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

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

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

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

Subspecs

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

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

僅安裝QueryKit庫(kù)下的Attribute模塊

pod 'QueryKit/Attribute'

*? 僅安裝QueryKit下的Attribute和QuerySet模塊

pod'QueryKit',:subspecs=>['Attribute','QuerySet']

Using the files from a local path (使用本地文件)

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

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

使用這個(gè)選項(xiàng)后,Cocoapods會(huì)將給定的文件夾認(rèn)為是Pod的源,并且在工程中直接引用這些文件。這就意味著你編輯的部分可以保留在CocoaPods安裝中,如果我們更新本地AFNetworking里面的代碼,cocoapods也會(huì)自動(dòng)更新。被引用的文件夾可以來自你喜愛的SCM,甚至當(dāng)前倉(cāng)庫(kù)的一個(gè)git子模塊注意:Pod的podspec文件也應(yīng)該被放在這個(gè)文件夾當(dāng)中

引用倉(cāng)庫(kù)根目錄的podspec

有時(shí)我們需要引入依賴庫(kù)指定的分支或節(jié)點(diǎn),寫法如下。

引入master分支(默認(rèn))

pod'AFNetworking',:git=>'https://github.com/gowalla/AFNetworking.git'\

*? 引入指定的分支

pod'AFNetworking',:git=>'https://github.com/gowalla/AFNetworking.git',:branch=>'dev'

*? 引入某個(gè)節(jié)點(diǎn)的代碼

pod'AFNetworking',:git=>'https://github.com/gowalla/AFNetworking.git',:tag=>'0.7.0'

*? 引入某個(gè)特殊的提交節(jié)點(diǎn)

pod'AFNetworking',:git=>'https://github.com/gowalla/AFNetworking.git',:commit=>'082f8319af'

需要特別注意的是,雖然這樣將會(huì)滿足任何在Pod中的依賴項(xiàng)通過其他Pods 但是podspec必須存在于倉(cāng)庫(kù)的根目錄中。

從外部引入podspec引入

podspec可以從另一個(gè)源庫(kù)的地址引入

pod'JSONKit',:podspec=>'https://example.com/JSONKit.podspec'

podspec

使用給定podspec文件中定義的代碼庫(kù)的依賴關(guān)系。如果沒有傳入任何參數(shù),podspec優(yōu)先使用根目錄,如果是其他情況必須在后面指明。(一般使用默認(rèn)設(shè)置即可)例如:

# 不指定表示使用根目錄下的podspec,默認(rèn)一般都會(huì)放在根目錄下podspec# 如果podspec的名字與庫(kù)名不一樣,可以通過這樣來指定podspec:name=>'QuickDialog'# 如果podspec不是在根目錄下,那么可以通過:path來指定路徑podspec:path=>'/Documents/PrettyKit/PrettyKit.podspec'

target

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

*? 定義一個(gè)簡(jiǎn)單target ZipApp引入SSZipArchive庫(kù)

target'ZipApp'dopod'SSZipArchive'end

*? 定義一個(gè)ZipApptarget僅引入SSZipArchive庫(kù),定義ZipAppTeststarget 引入Nimble的同時(shí)也會(huì)繼承ZipApptarget里面的SSZipArchive庫(kù)

target'ZipApp'dopod'SSZipArchive'target'ZipAppTests'doinherit!:search_pathspod'Nimble'endend

*? target塊中嵌套多個(gè)子塊

target'ShowsApp'do# ShowsApp 僅僅引入ShowsKitpod'ShowsKit'# 引入 ShowsKit 和 ShowTVAuthtarget'ShowsTV'dopod'ShowTVAuth'end# 引入了Specta和Expecta以及ShowsKittarget'ShowsTests'doinherit!:search_pathspod'Specta'pod'Expecta'endend

抽象target

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

簡(jiǎn)單寫法

abstract_target'Networking'dopod'AlamoFire'target'Networking App 1'target'Networking App 2'end

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

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

abstract! 和 inherit!

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

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

target'App'dotarget'AppTests'doinherit!:search_pathsendend

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

使用target 配置來控制的cocoapods生成project。開始時(shí)詳細(xì)說明您正在使用什么平臺(tái)上。工程文件里允許您具體說明哪些項(xiàng)目的鏈接。

platform

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

*? iOS->4.3? ? *? OS X->10.6? ? *? tvOS->9.0? ? *? watchOS->2.0? ? ? ? *

如果部署目標(biāo)需要iOS < 4.3,armv6體系結(jié)構(gòu)將被添加到ARCHS。

例如:

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

project

如果沒有顯示的project被指定,那么會(huì)默認(rèn)使用target的父target指定的project作為目標(biāo)。如果如果沒有任何一個(gè)target指定目標(biāo),那么就會(huì)使用和Podefile在同一目錄下的project。同樣也能夠指定是否這些設(shè)置在release或者debug模式下生效。為了做到這一點(diǎn),你必須指定一個(gè)名字和:release/:debuge關(guān)聯(lián)起來

Examples:

# MyGPSApp這個(gè)target引入的庫(kù)只能在FastGPS工程中引用

target'MyGPSApp'doproject'FastGPS'...end

# 原理同上

target'MyNotesApp'doproject'FastNotes'...end

# 使用自定義的編譯配置

project'TestProject','Mac App Store'=>:release,'Test'=>:debuginhibit_all_warnings!(強(qiáng)迫癥者的福音)

### inhibit_all_warnings!

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

# 隱藏SSZipArchive的警告而不隱藏ShowTVAuth的警告pod'SSZipArchive',:inhibit_warnings=>truepod'ShowTVAuth',:inhibit_warnings=>falseuse_frameworks!

通過指定use_frameworks!要求生成的是framework而不是靜態(tài)庫(kù)。

如果使用use_frameworks!命令會(huì)在Pods工程下的Frameworks目錄下生成依賴庫(kù)的framework

如果不使用use_frameworks!命令會(huì)在Pods工程下的Products目錄下生成.a的靜態(tài)庫(kù)

Workspace

默認(rèn)情況下,我們不需要指定,直接使用與Podfile所在目錄的工程名一樣就可以了。如果要指定另外的名稱,而不是使用工程的名稱,可以這樣指定:定:

workspace 'MyWorkspace'

Source

source是指定pod的來源。如果不指定source,默認(rèn)是使用CocoaPods官方的source。(建議使用默認(rèn)設(shè)置)

CocoaPods Master Repository# 使用其他來源地址source 'https://github.com/artsy/Specs.git'# 使用官方默認(rèn)地址(默認(rèn))source 'https://github.com/CocoaPods/Specs.git'

Hooks

Podfile提供了hook機(jī)制,它將在安裝過程中調(diào)用。hook是全局性的,不存儲(chǔ)于每個(gè)target中。

Plugin

指定應(yīng)在安裝期間使用的插件。使用此方法指定應(yīng)在安裝期間使用的插件,以及當(dāng)它被調(diào)用時(shí),應(yīng)傳遞給插件的選項(xiàng)。例如:

指定在安裝期間使用cocoapods-keys和slather這兩個(gè)插件plugin'cocoapods-keys',:keyring=>'Eidolon'plugin'slather'pre_install

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

格式如下:

pre_installdo|installer|# 做一些安裝之前的更改endpost_install

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

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

post_installdo|installer|installer.pods_project.targets.eachdo|target|target.build_configurations.eachdo|config|config.build_settings['GCC_ENABLE_OBJC_GC']='supported'endendenddef

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

def'CustomPods'pod'IQKeyboardManagerSwift'end

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

target'MyTarget'doCustomPodsend

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

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

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