前言
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è)
ZipApp
target僅引入SSZipArchive
庫搀愧,定義ZipAppTests
target 引入Nimble
的同時(shí)也會(huì)繼承ZipApp
target里面的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ì)有紕漏之處,還望指出行贪。