CocoaPods詳解3:.podfile語法參考

https://www.cnblogs.com/lxlx1798/p/14587268.html

一:前言

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

二: 什么是Podfile

Podfile是一個規(guī)范鹃彻,描述了一個或多個一套工程目標(biāo)的依賴項茶没。

1,一個簡單寫法:

target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
end

這是最簡單最普遍的寫法舌涨,針對MyApp這個target引入AFNetworking這個依賴庫糯耍,也是大家平時用的最多的一種方式。

2囊嘉,下面是個更復(fù)雜的一個例子:
下面兩行是指明依賴庫的來源地址

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

說明平臺是ios温技,版本是9.0

platform :ios, '9.0'

忽略引入庫的所有警告(強迫癥者的福音啊)

inhibit_all_warnings!

針對MyApp target引入AFNetworking
針對MyAppTests target引入OCMock

target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
  target 'MyAppTests' do
     inherit! :search_paths
  pod 'OCMock', '~> 2.0.1'
  end
end

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

post_install do |installer|
   installer.pods_project.targets.each do |target|
   puts target.name
   end
end

三:主配置

install! 這個命令是cocoapods聲明的一個安裝命令哗伯,用于安裝引入Podfile里面的依賴庫荒揣。
install! 這個命令還有一些個人設(shè)置選項,例如:

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

還支持其他的選項:

Supported Keys:
:clean
:deduplicate_targets
:deterministic_uuids
:integrate_targets
:lock_pod_sources
:share_schemes_for_development_pods
  • Dependencies(依賴項)

Podfile指定每個target的依賴項

  • pod指定特定的依賴庫
  • podspec可以提供一個API來創(chuàng)建podspecs
  • target通過target指定依賴范圍

pod - 指定項目的依賴項

依賴項規(guī)范是由Pod的名稱和一個可選的版本組合一起焊刹。

  • 如果后面不寫依賴庫的具體版本號系任,那么cocoapods會默認(rèn)選取最新版本。
pod 'SSZipArchive'
  • 如果你想要特定的依賴庫的版本虐块,就需要在后面寫上具體版本號俩滥,格式:
pod 'Objection', '0.9'
  • 也可以指定版本范圍

0.1 高于0.1版本(不包含0.1版本)的任意一個版本
= 0.1 高于0.1版本(包含0.1版本)的任意一個版本
< 0.1 低于0.1版本(不包含0.1版本)的任意一個
<= 0.1低于0.1版本(包含0.1版本)的任意一個
~> 0.1.2 版本 0.1.2的版本到0.2 ,不包括0.2贺奠。這個基于你指定的版本號的最后一個部分霜旧。這個例子等效于>= 0.1.2并且 <0.2.0,并且始終是你指定范圍內(nèi)的最新版本儡率。

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

Build configurations(編譯配置)

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

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

pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
或者,可以弄白名單只指定一個build configurations眉孩。
pod 'PonyDebugger', :configuration => 'Debug'
注意:默認(rèn)情況下如果不指定具體生成配置个绍,那么會包含在所有的配置中,如果你想具體指定就必須手動指明浪汪。
  • Subspecs

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

    我們也可以指定安裝具體依賴庫的某個子模塊死遭,例如:

    • 僅安裝QueryKit庫下的Attribute模塊
pod 'QueryKit/Attribute'
*   僅安裝QueryKit下的Attribute和QuerySet模塊
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
  • Using the files from a local path (使用本地文件)

    我們也可以指定依賴庫的來源地址广恢。如果我們想引入我們本地的一個庫,可以這樣寫:

pod 'AFNetworking', :path => '~/Documents/AFNetworking'
使用這個選項后殃姓,Cocoapods會將給定的文件夾認(rèn)為是Pod的源袁波,并且在工程中直接引用這些文件瓦阐。這就意味著你編輯的部分可以保留在CocoaPods安裝中,如果我們更新本地AFNetworking里面的代碼篷牌,cocoapods也會自動更新睡蟋。

被引用的文件夾可以來自你喜愛的SCM,甚至當(dāng)前倉庫的一個git子模塊

注意:Pod的podspec文件也應(yīng)該被放在這個文件夾當(dāng)中
  • 引用倉庫根目錄的podspec

    有時我們需要引入依賴庫指定的分支或節(jié)點枷颊,寫法如下戳杀。

    • 引入master分支(默認(rèn))
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'\
*   引入指定的分支
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
*   引入某個節(jié)點的代碼
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
*   引入某個特殊的提交節(jié)點
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
    需要特別注意的是,雖然這樣將會滿足任何在Pod中的依賴項通過其他Pods 但是podspec必須存在于倉庫的根目錄中夭苗。
  • 從外部引入podspec引入

podspec可以從另一個源庫的地址引入

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

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

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

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

*   定義一個簡單target ZipApp引入SSZipArchive庫
target 'ZipApp' do
pod 'SSZipArchive'
end
*   定義一個ZipApptarget僅引入SSZipArchive庫袜腥,定義ZipAppTeststarget 引入Nimble的同時也會繼承ZipApptarget里面的SSZipArchive庫
target 'ZipApp' do
pod 'SSZipArchive'
target 'ZipAppTests' do
inherit! :search_paths
pod 'Nimble'
end
end
*   target塊中嵌套多個子塊
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

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

簡單寫法

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

定義一種abstract_target包含多個target

# 注意:這是個抽象的target也就是說在工程中并沒有這個target引入ShowsKit
abstract_target 'Shows' do
pod 'ShowsKit'
# ShowsiOS target會引入ShowWebAuth庫以及繼承自Shows的ShowsKit庫
target 'ShowsiOS' do
pod 'ShowWebAuth'
end
# ShowsTV target會引入ShowTVAuth庫以及繼承自Shows的ShowsKit庫
target 'ShowsTV' do
pod 'ShowTVAuth'
end
# ShowsTests target引入了Specta和Expecta庫羹令,并且指明繼承Shows鲤屡,所以也會引入ShowsKit
target 'ShowsTests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
end
end

abstract! 和 inherit!
abstract! 指示當(dāng)前的target是抽象的,因此不會直接鏈接Xcode target福侈。
inherit! 設(shè)置當(dāng)前target的繼承模式执俩。例如:

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

Target configuration (目標(biāo)項配置)
使用target 配置來控制的cocoapods生成project。開始時詳細(xì)說明您正在使用什么平臺上癌刽。工程文件里允許您具體說明哪些項目的鏈接。

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

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

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

#指定具體平臺和版本
platform :ios, '4.0'
platform :ios

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

Examples:
# MyGPSApp這個target引入的庫只能在FastGPS工程中引用

target 'MyGPSApp' do
project 'FastGPS'
...
end

# 原理同上

target 'MyNotesApp' do
project 'FastNotes'
...
end

# 使用自定義的編譯配置

project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
inhibit_all_warnings!(強迫癥者的福音)

### inhibit_all_warnings!

屏蔽所有來自于cocoapods依賴庫的警告。你可以全局定義邻梆,也能在子target里面定義守伸,也可以指定某一個庫:

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

通過指定use_frameworks!要求生成的是framework而不是靜態(tài)庫。
如果使用use_frameworks!命令會在Pods工程下的Frameworks目錄下生成依賴庫的framework
如果不使用use_frameworks!命令會在Pods工程下的Products目錄下生成.a的靜態(tài)庫

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機制,它將在安裝過程中調(diào)用耳胎。hook是全局性的惯吕,不存儲于每個target中。

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

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

當(dāng)我們下載完成钳宪,但是還沒有安裝之時,可以使用hook機制通過pre_install指定要做更改扳炬,更改完之后進(jìn)入安裝階段吏颖。
格式如下:

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

當(dāng)我們安裝完成,但是生成的工程還沒有寫入磁盤之時恨樟,我們可以指定要執(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
def

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

def 'CustomPods'
pod 'IQKeyboardManagerSwift'
end

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

target 'MyTarget' do
CustomPods
end

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绳泉,隨后出現(xiàn)的幾起案子逊抡,更是在濱河造成了極大的恐慌,老刑警劉巖零酪,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冒嫡,死亡現(xiàn)場離奇詭異拇勃,居然都是意外死亡,警方通過查閱死者的電腦和手機孝凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門方咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胎许,你說我怎么就攤上這事峻呛。” “怎么了辜窑?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵钩述,是天一觀的道長。 經(jīng)常有香客問我穆碎,道長牙勘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任所禀,我火速辦了婚禮方面,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘色徘。我一直安慰自己恭金,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布褂策。 她就那樣靜靜地躺著横腿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斤寂。 梳的紋絲不亂的頭發(fā)上耿焊,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音遍搞,去河邊找鬼罗侯。 笑死,一個胖子當(dāng)著我的面吹牛溪猿,可吹牛的內(nèi)容都是我干的钩杰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诊县,長吁一口氣:“原來是場噩夢啊……” “哼榜苫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翎冲,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媳荒,沒想到半個月后抗悍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驹饺,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年缴渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了赏壹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衔沼,死狀恐怖蝌借,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情指蚁,我是刑警寧澤菩佑,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站凝化,受9級特大地震影響稍坯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搓劫,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一瞧哟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枪向,春花似錦勤揩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缠犀,卻和暖如春数苫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辨液。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工虐急, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滔迈。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓止吁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燎悍。 傳聞我的和親對象是個殘疾皇子敬惦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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