Podfile文件詳細描述了一個或多個工程中targets的依賴關系。Podfile會默認創建一個隱式的目標鏈接到工程中用戶的第一個target,名稱為“default”。
一個Podfile可以非常簡單:
pod 'AFNetworking', '~> 1.0'
也可以配置的復雜一點,如下:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' inhibit_all_warnings! xcodeproj 'MyProject' pod 'ObjectiveSugar', '~> 0.5' target :test do pod 'OCMock', '~> 2.0.1' end post_install do |installer| installer.pods_project.targets.each do |target| puts #{target.name} end end
Podfile描述用於各個用戶targe中的依賴項
pod 是聲明指定依賴的方法 podspec 提供了一個簡單的API用於創建podspecs target 允許你在工程中限定依賴項只在你指定的targets中生效指定工程的一個依賴
一個依賴項通過pod名和可選的版本號來聲明
當你開始一個項目的時候你可能只需要一個最新版本的依賴,那麼你就可以忽略版本號了,這樣寫:
pod 'SSZipArchive'
以後你可能想指定一個Pod的固定版本的時候,可以寫上具體的版本號來指定:
pod 'Objection', '0.9'
對版本號的操作除了指定與不指定,你還可以做其他操作:
>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,並且始終是你指定范圍內的最新版本
版本控制列表可用做更細的版本管理
最後,你可以使用標示 :head來指定版本. 這就意味著工程會使用指定spec下該pod的最新可以用版本,不過會強制下載’bleeding edge’高風險版本(HEAD).務必小心使用,因為spec可能導致不兼容
pod 'Objection', :head
重要提示:
下面的語法是暫時的,將來很可能會更改,恕不另行通知。因為大家都在要求這個功能,所以我們發布了這個功能。你可以使用它,但你可能需要改變你的Podfile去使用未來版本的CocoaPods。不管怎麼樣,一個簡單清晰的升級路徑會提供給你
默認情況下, 依賴項會被安裝在所有target的build configuration中。為了調試或者處於其他原因,依賴項只能在給定的build configuration中被啟用
pod 'PonyDebugger', :configurations => ['Release', 'App Store']
當然你也可以弄白名單只指定一個build configurations
當然你也可以只指定一個build configurations
當你用一個名字裝Pod的時候,它將安裝所有定義在podspec裡面的默認subspec
你可以這樣指定:
pod 'QueryKit/Attribute'
也可以指定一個集合,像下面這樣:
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
當然依賴也可以從其他源來獲取
如果你想用一個自己開發的本地的Pod,你可以用path選項
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
使用這個選項後,Cocoapods會將給定的文件夾認為是Pod的源,並且在工程中直接引用這些文件。這就意味著你編輯的部分可以保留在CocoaPods安裝中
被引用的文件夾可以來自你喜愛的SCM,甚至當前倉庫的一個git子模塊
注意:Pod的podspec文件也應該被放在這個文件夾當中
有的時候你可能想要使用一個最新的開發版本,或者某一個二次開發版本。如果是這樣,你可以在pod聲明中特別標明
使用倉庫中的master分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
使用倉庫的其他分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
使用倉庫的某個tag:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
或者指定一個提交記錄:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
需要特別注意的是,雖然這樣將會滿足任何在Pod中的依賴項通過其他Pods
但是podspec必須存在於倉庫的根目錄中,如果根目錄中沒有存在這個podspec文件,你將不得不使用下面提到的幾種方式之一
如果一個podspec能夠從外部的倉庫源的獲取,設想一下,也通過HTTP來獲取podspec:
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
使用一個在給定podspec中聲明的Pod的依賴項。如果如果沒有參數被傳遞,那麼在Podfile根部的第一個podspec會被使用。它將會被庫所在的工程所使用
注意:這個不會包含哪些來自於podspec的資源而僅僅是來自於CocoaPods基礎架構
例子:
podspec podspec :name => 'QuickDialog' podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
在target塊裡面定義依賴項,如果對應的target不想添加依賴可以用:exclusive => true參數
Podfile文件將會創建一個全局的target名叫:default,default將會生成一個libPod.a文件。這個target將會與用戶工程中的第一個target綁定起來如果沒有指定特殊的link_with屬性的話
例子:
定義一個target:
target :ZipApp do pod 'SSZipArchive' end
定義一個獨有的target:
target :ZipApp do pod 'SSZipArchive' target :test, :exclusive => true do pod 'JSONKit' end end
這些設置用來控制cocoapods生成project
開頭platform用來說明項目的工作平台,xcodeproj允許你指定需要鏈接的工程
指定了靜態庫應該被編譯在哪個平台
Cocoapods提供一個默認的部署目標如果你自己沒有指定的話。目前的默認設置是iOS4.3、OS X10.6、tvOS 9.0、watchOS 2.0
如果部署目標要求iOS版本小於4.3,armv6架構將會被添加到ARCHS中
例子:
指定平台
platform :ios, platform :ios
指定包含引用pod庫的target的Xcode工程會被鏈接到
如果沒有顯示的project被指定,那麼會默認使用target的父target指定的project作為目標。如果如果沒有任何一個target指定目標,那麼就會使用和Podefile在同一目錄下的project。同樣也能夠指定是否這些設置在release或者debug模式下生效。為了做到這一點,你必須指定一個名字和:release/:debuge關聯起來
例子:
指定用戶工程
# Look for target to link with in an Xcode project called # `MyProject.xcodeproj`. xcodeproj 'MyProject' target :test do # This Pods library links with a target in another project. xcodeproj 'TestProject' end
用自定義的編譯配置
xcodeproj 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
指定用戶project裡面中面的target鏈接到pod庫
如果沒有顯示的指定target,那麼就會鏈接到工程中的第一個target。所以如果你只需要鏈接第一個target,那麼你不需要使用link_with
例子:
鏈接用戶工程裡面的一個target
link_with 'MyApp'
鏈接多個target
link_with 'MyApp', 'MyOtherApp'
屏蔽cocoapods庫裡面的所有警告
這個特性也能在子target裡面定義
如果你想屏蔽某pod裡面的警告也是可以的:
pod 'SSZipArchive', :inhibit_warnings => true
可以用framework的pod替代靜態庫的
這個特性可以通過定義子target來繼承
這部分內容列舉了配置workspace的選項和設置全局配置
指定應該包含所有projects的Xcode workspace.
如果沒有顯示指定workspace並且在Podfile所在目錄只有一個project,那麼project的名稱會被用作於workspace的名稱
例子:
指定一個workspace
workspace 'MyWorkspace'
指定後從所有已經安裝的pod的頭文件中會生成一個BridgeSupport元數據文檔
一些腳本語言例如MacRuby,Nu,JSCocoa能夠利用這些作為橋接類型、函數等等
指定後-fobjc-arc flag會被添加到OTHER_LD_FLAGS中
這個是用來解決編譯non-ARC項目出現的一個的bug(詳見 #142)。本來這些事情都是有Xcode4.3.2中的libtool自動完成的,不過看來現在flag -fobjc-arc 已經不被支持了。所以必須顯示的指定使用這個方法
這個方法在CocoaPods 1.0中也許會被廢棄
Podfile檢索了所有sources(repos)中的specs
Sources是全局的,不存儲在每個target定義裡面
指定specs的位置
使用這個方法指定sources。sources的順序是有關系的的。CocoaPods將使用pod第一次出現的source中的最高版本(後續的source中哪怕出現了更高的版本,也不予考慮)
cocoapods 官方source是隱式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例子:
指定Artsy庫然後帶上官方的
CocoaPods Master Repository source 'https://github.com/artsy/Specs.git' source 'https://github.com/CocoaPods/Specs.git'
Podfile提供了鉤子用來在安裝時被調用
鉤子是全局的,不存儲在每個target定義裡面
指定的插件應該使用在安裝過程中
使用此方法來指定一個插件,應該在安裝過程中使用,同時,應傳遞給插件調用時的選項
例子:
指定用slather 和 cocoapods-keys插件
plugin 'cocoapods-keys', :keyring => 'Eidolon' plugin 'slather'
這個鉤子允許你在Pods被下載後但是還未安裝前對Pods做一些改變
它接受Pod::Installer作為唯一參數
例子:
定義pre_install鉤子
pre_install do |installer| # Do something fancy! end
這個鉤子允許你在生成的Xcode project寫入硬盤或者其他你想執行的操作前做最後的改動
它接受Pod::Installer作為唯一參數
例子:
給所有target自定義編譯配置
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