Podfile語法參考(譯)

本文翻譯自官方的Podfile Syntax Reference,也參考了之前一位博主的翻譯,若翻譯中有什么異議,歡迎留言指正。

Podfile

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

Dependencies(依賴項)

Podfile描述用于各個用戶targe中的依賴項

  • pod 是聲明指定依賴的方法
  • podspec 提供了一個簡單的API用于創建podspecs
  • target 允許你在工程中限定依賴項只在你指定的targets中生效

pod

指定工程的一個依賴

一個依賴項通過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

Build configurations(編譯配置)

重要提示:

下面的語法是暫時的,將來很可能會更改,恕不另行通知。因為大家都在要求這個功能,所以我們發布了這個功能。你可以使用它,但你可能需要改變你的Podfile去使用未來版本的CocoaPods。不管怎么樣,一個簡單清晰的升級路徑會提供給你

默認情況下, 依賴項會被安裝在所有target的build configuration中。為了調試或者處于其他原因,依賴項只能在給定的build configuration中被啟用

pod 'PonyDebugger', :configurations => ['Release', 'App Store']

當然你也可以弄白名單只指定一個build configurations

當然你也可以只指定一個build configurations

Subspecs

當你用一個名字裝Pod的時候,它將安裝所有定義在podspec里面的默認subspec

你可以這樣指定:

pod 'QueryKit/Attribute'

也可以指定一個集合,像下面這樣:

pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']

當然依賴也可以從其他源來獲取

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

如果你想用一個自己開發的本地的Pod,你可以用path選項

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

使用這個選項后,Cocoapods會將給定的文件夾認為是Pod的源,并且在工程中直接引用這些文件。這就意味著你編輯的部分可以保留在CocoaPods安裝中

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

注意:Pod的podspec文件也應該被放在這個文件夾當中

From a podspec in the root of a library repository (引用倉庫根目錄的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文件,你將不得不使用下面提到的幾種方式之一

From a podspec outside a spec repository, for a library without podspec(在一個不帶podsepec的庫里引用外部的spec)

如果一個podspec能夠從外部的倉庫源的獲取,設想一下,也通過HTTP來獲取podspec:

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

podspec

使用一個在給定podspec中聲明的Pod的依賴項。如果如果沒有參數被傳遞,那么在Podfile根部的第一個podspec會被使用。它將會被庫所在的工程所使用

注意:這個不會包含哪些來自于podspec的資源而僅僅是來自于CocoaPods基礎架構

例子:

podspec
podspec :name => 'QuickDialog'
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'

target

在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

Target configuration (目標項配置)

這些設置用來控制cocoapods生成project

開頭platform用來說明項目的工作平臺,xcodeproj允許你指定需要鏈接的工程

platform

指定了靜態庫應該被編譯在哪個平臺

Cocoapods提供一個默認的部署目標如果你自己沒有指定的話。目前的默認設置是iOS4.3OS X10.6tvOS 9.0watchOS 2.0

如果部署目標要求iOS版本小于4.3armv6架構將會被添加到ARCHS

例子:
指定平臺

platform :ios, 
platform :ios

xcodeproj

指定包含引用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

link_with

指定用戶project里面中面的target鏈接到pod庫

如果沒有顯示的指定target,那么就會鏈接到工程中的第一個target。所以如果你只需要鏈接第一個target,那么你不需要使用link_with

例子:

鏈接用戶工程里面的一個target

link_with 'MyApp'

鏈接多個target

link_with 'MyApp', 'MyOtherApp'

inhibit_all_warnings!

屏蔽cocoapods庫里面的所有警告

這個特性也能在子target里面定義

如果你想屏蔽某pod里面的警告也是可以的:

pod 'SSZipArchive', :inhibit_warnings => true

use_frameworks!

可以用framework的pod替代靜態庫的

這個特性可以通過定義子target來繼承

Workspace(工作區)

這部分內容列舉了配置workspace的選項和設置全局配置

workspace

指定應該包含所有projects的Xcode workspace.

如果沒有顯示指定workspace并且在Podfile所在目錄只有一個project,那么project的名稱會被用作于workspace的名稱

例子:
指定一個workspace

workspace 'MyWorkspace'

generate_bridge_support!

指定后從所有已經安裝的pod的頭文件中會生成一個BridgeSupport元數據文檔

一些腳本語言例如MacRuby,Nu,JSCocoa能夠利用這些作為橋接類型、函數等等

set_arc_compatibility_flag!

指定后-fobjc-arc flag會被添加到OTHER_LD_FLAGS

這個是用來解決編譯non-ARC項目出現的一個的bug(詳見 #142)。本來這些事情都是有Xcode4.3.2中的libtool自動完成的,不過看來現在flag -fobjc-arc 已經不被支持了。所以必須顯示的指定使用這個方法

這個方法在CocoaPods 1.0中也許會被廢棄

Sources

Podfile檢索了所有sources(repos)中的specs

Sources是全局的,不存儲在每個target定義里面

source

指定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'

Hooks(鉤子)

Podfile提供了鉤子用來在安裝時被調用

鉤子是全局的,不存儲在每個target定義里面

plugin

指定的插件應該使用在安裝過程中

使用此方法來指定一個插件,應該在安裝過程中使用,同時,應傳遞給插件調用時的選項

例子:

指定用slathercocoapods-keys插件

plugin 'cocoapods-keys', :keyring => 'Eidolon'
plugin 'slather'

pre_install

這個鉤子允許你在Pods被下載后但是還未安裝前對Pods做一些改變

它接受Pod::Installer作為唯一參數

例子:

定義pre_install鉤子

pre_install do |installer|
  # Do something fancy!
end

post_install

這個鉤子允許你在生成的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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容