你真的會(huì)寫Podfile嗎?

前言

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

什么是Podfile

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

一個(gè)簡單寫法:

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

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

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

# 下面兩行是指明依賴庫的來源地址
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'

# 說明平臺(tái)是ios晤郑,版本是9.0
platform :ios, '9.0'

# 忽略引入庫的所有警告(強(qiáng)迫癥者的福音安锐谩)
inhibit_all_warnings!

# 針對(duì)MyApp target引入AFNetworking
# 針對(duì)MyAppTests target引入OCMock,
target 'MyApp' do 
    pod 'AFNetworking', '~> 3.0' 
    target 'MyAppTests' do
       inherit! :search_paths 
       pod 'OCMock', '~> 2.0.1' 
    end
end
# 這個(gè)是cocoapods的一些配置,官網(wǎng)并沒有太詳細(xì)的說明,一般采取默認(rèn)就好了,也就是不寫.
post_install do |installer|       
   installer.pods_project.targets.each do |target| 
     puts target.name 
   end
end

主配置

install! 這個(gè)命令是cocoapods聲明的一個(gè)安裝命令贩汉,用于安裝引入Podfile里面的依賴庫。
install! 這個(gè)命令還有一些個(gè)人設(shè)置選項(xiàng)锚赤,例如:

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

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

Supported Keys:

:clean

:deduplicate_targets

:deterministic_uuids

:integrate_targets

:lock_pod_sources

:share_schemes_for_development_pods

關(guān)于以上的配置匹舞,官網(wǎng)也沒有一個(gè)確切的說明,以為我們只需用系統(tǒng)默認(rèn)即可线脚。

Dependencies(依賴項(xiàng))

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

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

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

依賴項(xiàng)規(guī)范是由Pod的名稱和一個(gè)可選的版本組合一起赐稽。
1> 如果后面不寫依賴庫的具體版本號(hào),那么cocoapods會(huì)默認(rèn)選取最新版本浑侥。

pod 'SSZipArchive'

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

pod 'Objection', '0.9'

3> 也可以指定版本范圍

  • > 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)參考下面鏈接:
語義化版本

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ì)通過依賴庫的名稱來引入,cocoapods會(huì)默認(rèn)安裝依賴庫的所有內(nèi)容葵姥。
我們也可以指定安裝具體依賴庫的某個(gè)子模塊荷鼠,例如:

# 僅安裝QueryKit庫下的Attribute模塊
pod 'QueryKit/Attribute'

# 僅安裝QueryKit下的Attribute和QuerySet模塊
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']

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

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

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

使用這個(gè)選項(xiàng)后允乐,Cocoapods會(huì)將給定的文件夾認(rèn)為是Pod的源矮嫉,并且在工程中直接引用這些文件。這就意味著你編輯的部分可以保留在CocoaPods安裝中牍疏,如果我們更新本地AFNetworking里面的代碼蠢笋,cocoapods也會(huì)自動(dòng)更新。

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

注意:Pod的podspec文件也應(yīng)該被放在這個(gè)文件夾當(dāng)中

From a podspec in the root of a library repository (引用倉庫根目錄的podspec)

有時(shí)我們需要引入依賴庫指定的分支或節(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必須存在于倉庫的根目錄中援岩。

從外部引入podspec引入

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

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

podspec

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

# 不指定表示使用根目錄下的podspec趟咆,默認(rèn)一般都會(huì)放在根目錄下
podspec
# 如果podspec的名字與庫名不一樣添瓷,可以通過這樣來指定
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è)簡單target ZipApp引入SSZipArchive
target 'ZipApp' do 
  pod 'SSZipArchive'
end

  • 定義一個(gè)ZipApptarget僅引入SSZipArchive庫搀愧,定義ZipAppTeststarget 引入Nimble的同時(shí)也會(huì)繼承ZipApptarget里面的SSZipArchive
target 'ZipApp' do 
  pod 'SSZipArchive' 
  target 'ZipAppTests' 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)^承疆偿。

  • 簡單寫法
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庫以及繼承自Shows的ShowsKit庫
    target 'ShowsiOS' do
        pod 'ShowWebAuth'
    end
    # ShowsTV target會(huì)引入ShowTVAuth庫以及繼承自Shows的ShowsKit庫
    target 'ShowsTV' do
        pod 'ShowTVAuth'
    end
    # ShowsTests target引入了Specta和Expecta庫妈橄,并且指明繼承Shows,所以也會(huì)引入ShowsKit
    target 'ShowsTests' do
        inherit! :search_paths 
        pod 'Specta' 
        pod 'Expecta' 
    end
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

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

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

platform

platform用于指定應(yīng)建立的靜態(tài)庫的平臺(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:
Specifying the user project

# MyGPSApp這個(gè)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!(強(qiáng)迫癥者的福音)

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

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

use_frameworks!

通過指定use_frameworks!要求生成的是framework而不是靜態(tài)庫碟案。
如果使用use_frameworks!命令會(huì)在Pods工程下的Frameworks目錄下生成依賴庫的framework
如果不使用use_frameworks!命令會(huì)在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機(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_install do |installer| 
    # 做一些安裝之前的更改
end

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

def

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

def 'CustomPods'
   pod 'IQKeyboardManagerSwift'
end 

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

target 'MyTarget' do 
   CustomPods
end 

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

總結(jié)

本文主要介紹Podfile文件的一些要素,也是自己的一個(gè)學(xué)習(xí)記錄過程凫海,由于本人水平有限呛凶,難免會(huì)有紕漏之處,還望指出行贪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漾稀,一起剝皮案震驚了整個(gè)濱河市模闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌县好,老刑警劉巖围橡,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缕贡,居然都是意外死亡翁授,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門晾咪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來收擦,“玉大人,你說我怎么就攤上這事谍倦∪福” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵昼蛀,是天一觀的道長宴猾。 經(jīng)常有香客問我,道長叼旋,這世上最難降的妖魔是什么仇哆? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮夫植,結(jié)果婚禮上讹剔,老公的妹妹穿的比我還像新娘。我一直安慰自己详民,他們只是感情好延欠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沈跨,像睡著了一般由捎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饿凛,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天隅俘,我揣著相機(jī)與錄音,去河邊找鬼笤喳。 笑死为居,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杀狡。 我是一名探鬼主播蒙畴,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了膳凝?” 一聲冷哼從身側(cè)響起碑隆,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹬音,沒想到半個(gè)月后上煤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡著淆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年劫狠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永部。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡独泞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苔埋,到底是詐尸還是另有隱情懦砂,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布组橄,位于F島的核電站荞膘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玉工。R本人自食惡果不足惜羽资,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓮栗。 院中可真熱鬧,春花似錦瞄勾、人聲如沸费奸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愿阐。三九已至,卻和暖如春趾疚,著一層夾襖步出監(jiān)牢的瞬間缨历,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工糙麦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛孵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓赡磅,卻偏偏與公主長得像魄缚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359