什么是Podfile
Podfile是一個規(guī)范,描述了一個或多個一套工程目標的依賴項,CocoaPods管理iOS組件庫
各種參數(shù)配置含義
一仰坦、Install狈醉! :適用于整個podfile文件
1.指明了cocoapods安裝podfile使用的安裝方法和配置項
install! 'cocoapods', //第一個參數(shù)是安裝方法解阅,剩下的參數(shù)是選擇項,現(xiàn)在安裝方法只支持’cocoapods’
:deterministic_uuids => false,
:integrate_targets => false
還有以下配置參數(shù)
:clean
:deduplicate_targets
:deterministic_uuids
:integrate_targets
:lock_pod_sources
:warn_for_multiple_pod_sources
:share_schemes_for_development_pods
2.source: 默認被指定的依賴項會在全局級別的指定源中匹配搜索圈匆×诳裕可以為特依賴關(guān)系指定源
//指定特定源中搜索,并忽略任何全局源*
pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
這個source為repo的url焕檬,如何得到這個url呢姆坚,在終端中pod repo list 查看出對應(yīng)的repo中URL
3.target:
target: 在制定的快內(nèi)定義pod target和指定的依賴范圍嗎。target應(yīng)該與Xcode的target相符实愚。默認情況下兼呵,target包含定義在塊外的依賴,除非指定不使用inherit!來繼承
//a. target A 引入AFN庫
target ‘A'do
pod 'AFN'
end
//b.定義’A’ 引入AFN庫腊敲,定義’B’target引入’SSZip’庫击喂,同時會繼承’A’target 中的’AFN’庫
target ‘A’ do
pod ‘AFN’
target ‘B’ do
inherit! :search_paths
pod 'SSZip'
end
end
// c. 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
end
4.abstract_target :定義一個抽象的target,為了方便target目標依賴繼承碰辅。這個target是沒有被定義在xcode中的懂昂。例子:
// a.定義一個抽象target
abstract_target 'Networking' do
pod ‘AlamoFire'
target 'Networking App 1’
target 'Networking App 2’
end
// b. 定義一個包含多個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
意義:可以使用抽象類 來統(tǒng)一 需要繼承的pod凌彬。
5.abstract! 指定當前target是抽象target
target ‘A’ do
abstract!
end
6.inherit! 設(shè)置當前target的繼承關(guān)系
target 'App’ do
target ‘A’ do
#這個target 繼承 父級所有行為
inherit! :complete
end
target ‘B’ do
#這個target 不繼承 父級所有行為
inherit! :none
end
target ‘C’ do
#target 僅繼承 父級的搜索路勁
inherit! :search_paths
end
end
7.platform :用于指明應(yīng)建立的靜態(tài)庫的平臺。
cocoapods默認指定的平臺配置:
· iOS->4.3
· OS X->10.6
· tvOS->9.0
· watchOS->2.0
如果部署target需要iOS<4.3,armv6架構(gòu)講被添加到ARCHS
使用:
#指定具體平臺和版本
platform :ios, ‘4.0'
platform :ios
8.Inhibit_all_warnings! :忽略cocoapods依賴庫的警告循衰〔玻可以全局 定義,也可以定義在子target中会钝,也可以指定某個庫
pod 'SSZipArchive', :inhibit_warnings => true
pod 'SSZipArchive', :inhibit_warnings => false
9.use_frameworks! :通過指定 use_frameworks! 要求生成的是framework而不是靜態(tài)庫伐蒋,swift沒有靜態(tài)庫。
*如果使用use_frameworks!命令會在Pods工程下的Frameworks目錄下生成依賴庫的framework*
*如果不使用use_frameworks!命令會在Pods工程下的Products目錄下生成.a的靜態(tài)庫*
通過指定use_frameworks!要求生成的是framework而不是靜態(tài)庫迁酸。
如果使用use_frameworks!命令會在Pods工程下的Frameworks目錄下生成依賴庫的framework
如果不使用use_frameworks!命令會在Pods工程下的Products目錄下生成.a的靜態(tài)庫
10.source
1.source: 是指定pod的來源咽弦。如果不指定source,默認是使用CocoaPods官方的source胁出。(建議使用默認設(shè)置)
# 使用其他來源地址
source 'https://github.com/artsy/Specs.git’
# 使用官方默認地址(默認)
source 'https://github.com/CocoaPods/Specs.git'
主要:如果使用自己的私有庫型型,需要使用source指定到私有庫地址
11.Hooks Podfile提供了hook機制,它將在安裝過程中調(diào)用全蝶。hook是全局性的闹蒜,不存儲于每個target中寺枉。
1.Plugin :指定應(yīng)在安裝期間使用的插件。使用此方法指定應(yīng)在安裝期間使用的插件绷落,以及當它被調(diào)用時姥闪,應(yīng)傳遞給插件的選項。例如:
# 指定在安裝期間使用cocoapods-keys和slather這兩個插件
plugin 'cocoapods-keys', :keyring => 'Eidolon' plugin 'slather’
2.pre_install: 當我們下載完成砌烁,但是還沒有安裝之時筐喳,可以使用hook機制通過pre_install指定要做更改,更改完之后進入安裝階段函喉。格式如下:
pre_install do |installer|
# 做一些安裝之前的更改
end
3.post_install:當我們安裝完成避归,但是生成的工程還沒有寫入磁盤之時,我們可以指定要執(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
12.def命令來聲明一個pod集
def univeral_pods
pod 'IQKeyboardManagerSwift’
end
#然后捐下,我們就可以在需要引入的target處引入
target 'MyTarget' do
univeral_pods
end
一個簡單寫法:
target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
end
這是最簡單最普遍的寫法账锹,針對MyApp這個target引入AFNetworking這個依賴庫,也是大家平時用的最多的一種方式坷襟。
下面是個更復雜的一個例子:
# 下面兩行是指明依賴庫的來源地址
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)并沒有太詳細的說明,一般采取默認就好了,也就是不寫.
post_install do |installer|
installer.pods_project.targets.each do |target|
puts target.name
end
end
Build configurations(編譯配置)
默認情況下鸟缕, 依賴項會被安裝在所有target的build configuration中。為了調(diào)試或者處于其他原因排抬,依賴項只能在給定的build configuration中被啟用。
下面寫法指明只有在Debug和Beta模式下才有啟用配置
pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
或者授段,可以弄白名單只指定一個build configurations蹲蒲。
pod 'PonyDebugger', :configuration => 'Debug'
注意:默認情況下如果不指定具體生成配置,那么會包含在所有的配置中侵贵,如果你想具體指定就必須手動指明届搁。
Subspecs
subspecs的podspec文件中的寫法:
一般情況我們會通過依賴庫的名稱來引入,cocoapods會默認安裝依賴庫的所有內(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會將給定的文件夾認為是Pod的源,并且在工程中直接引用這些文件乞娄。這就意味著你編輯的部分可以保留在CocoaPods安裝中瞬逊,如果我們更新本地AFNetworking里面的代碼显歧,cocoapods也會自動更新。
被引用的文件夾可以來自你喜愛的SCM确镊,甚至當前倉庫的一個git子模塊
注意:Pod的podspec文件也應(yīng)該被放在這個文件夾當中
From a podspec in the root of a library repository (引用倉庫根目錄的podspec)
有時我們需要引入依賴庫指定的分支或節(jié)點士骤,寫法如下。
- 引入master分支(默認)
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引入
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
podspec
使用給定podspec文件中定義的代碼庫的依賴關(guān)系。如果沒有傳入任何參數(shù)旨巷,podspec優(yōu)先使用根目錄巨缘,如果是其他情況必須在后面指明。(一般使用默認設(shè)置即可)例如:
# 不指定表示使用根目錄下的podspec契沫,默認一般都會放在根目錄下
podspec
# 如果podspec的名字與庫名不一樣带猴,可以通過這樣來指定
podspec :name => 'QuickDialog'
# 如果podspec不是在根目錄下,那么可以通過:path來指定路徑
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
Podfile.lock文件:
當團隊中的某個人執(zhí)行完pod install命令后懈万,生成的Podfile.lock文件就記錄下了當時最新Pods依賴庫的版本拴清,這時團隊中的其它人check下來這份包含Podfile.lock文件的工程以后,再去執(zhí)行pod install命令時会通,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致口予。如果沒有Podfile.lock文件,后續(xù)所有用戶執(zhí)行pod install命令都會獲取最新版本的SBJson涕侈,這就有可能造成同一個團隊使用的依賴庫版本不一致沪停, 這對團隊協(xié)作來說絕對是個災(zāi)難!