Podfile 語(yǔ)法參考 v1.2.0.beta.1

CocoaPods是Swift和OC項(xiàng)目的依賴(lài)項(xiàng)管理器干厚。
Podfile是一個(gè)規(guī)范褐着,描述一個(gè)或多個(gè)Xcode項(xiàng)目目標(biāo)的依賴(lài)關(guān)系荧琼。
此文目的:我們經(jīng)常使用CocoaPods來(lái)管理iOS項(xiàng)目中的第三方庫(kù)搞挣,但是從來(lái)沒(méi)有完整地學(xué)習(xí)過(guò)Podfile的語(yǔ)法規(guī)則缅阳。
本文翻譯自CocoaPods官網(wǎng)

一磕蛇、Podfile示例

大概了解下,Podfile可以設(shè)置哪些內(nèi)容十办。

1秀撇、podfile可以簡(jiǎn)單

target 'MyApp'
pod 'AFNetworking', '~> 1.0'

2、也可以復(fù)雜

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
  pod 'ObjectiveSugar', '~> 0.5'

  target "MyAppTests" do
    inherit! :search_paths
    pod 'OCMock', '~> 2.0.1'
  end
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    puts "#{target.name}"
  end
end

二向族、語(yǔ)法介紹

1呵燕、Root Options

(1)install!
Podfile唯一的全局配置,用來(lái)指定當(dāng)CocoaPods安裝這個(gè)Podfile時(shí)要使用的安裝方法和選項(xiàng)件相。第一個(gè)參數(shù)表示要使用的安裝方法;下一個(gè)參數(shù)表示安裝選項(xiàng)再扭。目前,唯一接受的安裝方法是“cocoapods”夜矗,因此您將始終使用該值作為第一個(gè)參數(shù);但是更多的安裝方法可能在以后的版本中可用泛范。

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

支持的keys:
但是官方并沒(méi)有解釋如何用,通常也用不到install!這個(gè)命令紊撕“盏矗可以忽略,有個(gè)印象就可以了
:clean
:deduplicate_targets
:deterministic_uuids
:integrate_targets
:lock_pod_sources
:share_schemes_for_development_pods

2对扶、依賴(lài) Dependencies

可以指定每個(gè)target的依賴(lài)

(1)pod

①設(shè)置依賴(lài)庫(kù)版本

pod 'name' ,'version'

如果想安裝最新版本区赵,那么不指定版本就好了

pod 'AFNetworking'

安裝指定版本

pod 'AFNetworking', '2.4.1'

指定版本范圍,也可以使用操作符:

  • = 0.1 版本0.1浪南。
  • > 0.1 大于0.1的版本惧笛。
  • >= 0.1 大于等于0.1的版本。
  • < 0.1 小于0.1的版本逞泄。
  • <= 0.1 小于等于0.1的版本患整。
  • ~> 0.1.2 等價(jià)于>=0.12且<0.2 并且將始終匹配最新的已知版本拜效。
    如果對(duì)版本有更精細(xì)力度的要求,請(qǐng)參見(jiàn) Semantic Versioning各谚、 RubyGems Versioning Policies

②Build configurations

依賴(lài)項(xiàng)默認(rèn)是安裝在target所有的構(gòu)建配置中紧憾。但是有時(shí)候可能只在某個(gè)環(huán)境添加依賴(lài)項(xiàng),此時(shí)可以設(shè)置需要添加依賴(lài)項(xiàng)的構(gòu)建環(huán)境列表昌渤。

#只在Debug和Beta模式下才有啟用配置
pod 'PonyDebugger', :configurations => ['Debug', 'Beta']

AFNetworking只安裝到debug環(huán)境

pod 'AFNetworking', :configuration => 'Debug'

③Subspecs

當(dāng)通過(guò)名字安裝依賴(lài)庫(kù)的時(shí)候赴穗,會(huì)默認(rèn)安裝依賴(lài)庫(kù)的所有內(nèi)容,所有子模塊膀息。
安裝一個(gè)特定的子模塊,如下

pod 'AFNetworking/Reachability'

還可以指定安裝的子模塊集合

pod 'AFNetworking', :subspecs => ['Serialization', 'Security']
指定子模塊安裝

支持的子模塊可以通過(guò)pod search查詢

$ pod search AFNetworking

pod search AFNetworking結(jié)果

④安裝本地依賴(lài)庫(kù)

pod 'UZHybridModule', :path => '../UZHybridModule'

使用path選項(xiàng)之后可以從本地安裝依賴(lài)庫(kù)般眉,../UZHybridModule是依賴(lài)庫(kù)的本地路徑,這些文件被直接引入到工程中潜支。會(huì)被添加到Development Pods文件夾下甸赃,也就是pod的開(kāi)發(fā)者模式,對(duì)依賴(lài)庫(kù)代碼編輯有效冗酿。
【注意】本地依賴(lài)庫(kù)文件夾下要包含podspec文件

⑤通過(guò)倉(cāng)庫(kù)根目錄下的podspec引入

使用master分支

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

指定分支埠对,比如dev

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'

⑥依賴(lài)庫(kù)沒(méi)有獨(dú)立podspec的情況

如果一個(gè)依賴(lài)庫(kù)的podspec來(lái)自另一個(gè)源

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

如果不給podspec設(shè)置參數(shù),那么默認(rèn)使用根目錄下的podspec裁替。

# 不傳參數(shù)表示使用根目錄下的podspec项玛,默認(rèn)一般都會(huì)放在根目錄下
podspec 
#如果podspec名與依賴(lài)庫(kù)名不相同的話,使用這個(gè)指定name
podspec :name => 'QuickDialog'
#如果podspec不在根目錄的弱判,需要設(shè)置path
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
(3)target

在給定的塊內(nèi)定義target以及依賴(lài)的范圍襟沮,target與Xcode中的target是對(duì)應(yīng)的。默認(rèn)情況下target包含定義在塊之外的依賴(lài)昌腰,除非指明不繼承 臣嚣。
可以結(jié)合下文中 多個(gè)子模塊嵌套的情況 進(jìn)行理解

target  'target名' 

定義一個(gè)target

target 'ZipApp' do
  pod 'SSZipArchive'
end

定義一個(gè)從其父節(jié)點(diǎn)訪問(wèn)SSZipArchive 的測(cè)試target(ZipAppTests)
ZipApp 只引入SSZipArchive,ZipAppTests會(huì)引入SSZipArchive和Nimble

target 'ZipApp' do
  pod 'SSZipArchive'

  target 'ZipAppTests' do
    inherit! :search_paths
    pod 'Nimble'
  end
end

多個(gè)子模塊嵌套的情況

target 'ShowsApp' do
  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
(4)abstract_target

定義一個(gè)抽象target剥哑,方便其他target繼承

abstract_target 'target名'

定義一個(gè)抽象target

abstract_target 'Networking' do
  pod 'AlamoFire'

  target 'Networking App 1'
  target 'Networking App 2'
end

定義一個(gè)包含多個(gè)target的抽象target

# Note: There are no targets called "Shows" in any of this workspace's Xcode projects
#在項(xiàng)目中并沒(méi)有一個(gè)叫Shows的target,這里可以隨便起一個(gè)名字淹父。
abstract_target 'Shows' do
  pod 'ShowsKit'

  # The target ShowsiOS has its own copy of ShowsKit (inherited) + ShowWebAuth (added here)
  #ShowsiOS自己擁有ShowsKit(繼承的)+ShowWebAuth (通過(guò)pod添加的)
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # The target ShowsTV has its own copy of ShowsKit (inherited) + ShowTVAuth (added here)
  #ShowsTV自己擁有ShowsKit (繼承的) + ShowTVAuth (通過(guò)pod添加的)
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end

  # 測(cè)試target有自己添加的Specta+ Expecta株婴,也能訪問(wèn)ShowsKit,因?yàn)樗浅橄?Shows的子target暑认。
  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end
(5)abstract!

表示當(dāng)前目標(biāo)是抽象的困介,因此不會(huì)直接鏈接到Xcode目標(biāo)。

(6)inherit!

設(shè)置當(dāng)前target的繼承模式蘸际。

inherit! mode
  • mode的值:
    :complete 繼承父類(lèi)的所有行為座哩。
    :none 不繼承父類(lèi)的行為
    :search_paths 只繼承父類(lèi)的搜索路徑,官方?jīng)]有給更過(guò)的解釋?zhuān)瑐€(gè)人覺(jué)得這里對(duì)應(yīng)build setting中的search path粮彤。

3根穷、Target configuration

這些設(shè)置用于控制cocoapods生成的項(xiàng)目姜骡。
最簡(jiǎn)單的 只需說(shuō)明你所需的platform。xcodeproj允許指定要鏈接的項(xiàng)目屿良。

(1)platform

指定構(gòu)建靜態(tài)庫(kù)的平臺(tái)圈澈。

platform  name , target

支持的參數(shù)

  • name : symbol類(lèi)型平臺(tái)的名稱(chēng)
    值可以是:
    :osx 代表OS X,
    :ios 代表 iOS,
    :tvos 代表tvOS,
    :watchos 代表watchOS尘惧。

  • target: string類(lèi)型康栈,可選值,對(duì)應(yīng)Xcode中的deployment target喷橙,也就是我們最低適配版本啥么。
    當(dāng)前默認(rèn)值為iOS 4.3,OS X 10.6贰逾,tvOS 9.0悬荣,watchOS 2.0。
    如果部署目標(biāo)要求(iOS < 4.3)似踱,那么armv6架構(gòu)將被添加到ARCHS中隅熙。

#iOS平臺(tái),適配最低版本為4.0·
platform :ios, '4.0'
platform :ios
(2)project

指定Xcode project核芽,該project包含了鏈接pod庫(kù)的target囚戚。
如果target沒(méi)有指明project,并且Podfile所在目錄下只有一個(gè)project轧简,那么這個(gè)project就會(huì)被使用驰坊。也可以設(shè)置build setting在release或是debug情況下如何配置。要做到這一點(diǎn)哮独,你需要將每個(gè)build configuration的名字與:release或是:debug關(guān)聯(lián)

project path, build_configurations

支持的參數(shù)

  • path : project路徑
  • build_configurations : 是Hash{String => symbol}這種格式的哈希值拳芙,key是Xcode project中build configuration的名字,value是 :debug 或者 :release皮璧。不指定默認(rèn) :release

指明project

# This Target can be found in a Xcode project called `FastGPS`
#這個(gè)目標(biāo)可以在一個(gè)名為“FastGPS”的Xcode項(xiàng)目中找到
target 'MyGPSApp' do
  project 'FastGPS'
  ...
end

# Same Podfile, multiple Xcodeprojects
#多個(gè)Xcodeprojects Podfile相同,
target 'MyNotesApp' do
  project 'FastNotes'
  ...
end

使用自定義build configuration

project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
(3)被廢棄的命令

xcodeproj在1.0中被棄用舟扎,并被重命名為project。對(duì)于1.0之前的版本悴务,使用xcodeproj睹限。
link_with在1.0中被棄用,被abstract_target和inheritance 代替讯檐。

(4)inhibit_all_warnings!

屏蔽所有cocoapods的警告羡疗。
可以全局設(shè)置,也可以屏蔽某個(gè)pod的警告别洪。

pod 'SSZipArchive', :inhibit_warnings => true

全局設(shè)置之后叨恨,也可以設(shè)置某個(gè)pod不屏蔽警告。

pod 'SSZipArchive', :inhibit_warnings => false
(5)use_frameworks!

生成動(dòng)態(tài)庫(kù)而不是靜態(tài)庫(kù)
此屬性被target定義繼承挖垛。
使用use_frameworks與不使用痒钝,生成的庫(kù)文件如下所示

target 'runtime' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for runtime
  pod 'AFNetworking', :subspecs => ['Serialization', 'Security']
  
end
no use_frameworks!
target 'runtime' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
   use_frameworks!

  # Pods for runtime
  pod 'AFNetworking', :subspecs => ['Serialization', 'Security']
  
end
use_frameworks!

`

4秉颗、Workspace

接下來(lái)講述配置Workspace和設(shè)置全局設(shè)置的選項(xiàng)。

(1)workspace

用于指定workspace午乓。如果沒(méi)有指定明確的workspace站宗,并且在Podfile同一個(gè)目錄中只有一個(gè)project,那么該項(xiàng)目的名稱(chēng)就被用作workspace的名稱(chēng)益愈。

workspace  path

path:workspace的路徑梢灭,通常都是在Podfile同一個(gè)目錄下

#如果workspace名不是工程名,可以如下指定
workspace 'MyWorkspace'
(2)generate_bridge_support!

沒(méi)用過(guò)蒸其,看到知道是什么意思就可以了敏释。
指明BridgeSupport元數(shù)據(jù)文檔應(yīng)該從所有安裝的pod庫(kù)頭文件中生成。
這是用于腳本語(yǔ)言摸袁,如MacRuby钥顽、Nu和JSCocoa,它們使用它來(lái)橋接類(lèi)型靠汁、函數(shù)等蜂大。

(3)set_arc_compatibility_flag!

現(xiàn)在應(yīng)該用不到了。
指明-fobjc-arc要被添加到OTHER_LD_FLAGS中
用來(lái)解決Xcode 4.3.2的libtool不再支持- fobjc- arc標(biāo)志的問(wèn)題蝶怔,需要使用這種方式顯式啟用它奶浦。

5、Sources

全局配置source信息踢星,用于指定specs的位置

source 'URL'

使用這個(gè)方法指定source澳叉,source列表的順序決定讀取順序,會(huì)讀取第一個(gè)包含我們需要pod的source沐悦,并且使用pod的最高版本成洗,不管其他源是不是有更高的版本。
指定第一個(gè)使用artsy的源藏否。因?yàn)镃ocoaPods的源是隱式瓶殃,指定了其他的源之后就需要顯示包含一下。

CocoaPods Master Repository
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'

6副签、Hooks

Podfile提供在安裝過(guò)程中調(diào)用的鉤子遥椿。
鉤子是全局的,不存儲(chǔ)在任何一個(gè)target定義中

(1)plugin

使用此方法來(lái)指定在安裝期間應(yīng)該使用的插件继薛,以及當(dāng)插件被調(diào)用時(shí)應(yīng)該傳遞的參數(shù)。

plugin name ,options

name: String類(lèi)型愈捅,插件名稱(chēng)
options: Hash類(lèi)型遏考,可選值。當(dāng)插件的鉤子被調(diào)用時(shí)用來(lái)傳遞參數(shù)蓝谨。

#指定使用“slather”和“cocoapods - keys”插件灌具。
plugin 'cocoapods-keys', :keyring => 'Eidolon'
plugin 'slather'
(2)pre_install

這個(gè)鉤子允許你在Pods下載完成后且安裝之前對(duì)Pods進(jìn)行修改青团。
只接受Pod::Installer作為參數(shù)

#在Podfile中定義預(yù)安裝鉤子浆熔。
pre_install do |installer|
  # Do something fancy!
end
(3)post_install

這個(gè)鉤子允許你在Xcode項(xiàng)目寫(xiě)入磁盤(pán)之前做最后的修改树灶,或者執(zhí)行一些其他的任務(wù)。
只接受Pod::Installer作為參數(shù)

#定制所有目標(biāo)的構(gòu)建設(shè)置
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

以上只是參照官方文檔結(jié)合自己的理解寫(xiě)的伶贰,如果有不正確的地方诱贿,或者是有更深層次的理解娃肿,歡迎留言交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末珠十,一起剝皮案震驚了整個(gè)濱河市料扰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焙蹭,老刑警劉巖晒杈,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孔厉,居然都是意外死亡拯钻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)撰豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粪般,“玉大人,你說(shuō)我怎么就攤上這事郑趁】浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵寡润,是天一觀的道長(zhǎng)捆憎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)梭纹,這世上最難降的妖魔是什么躲惰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮变抽,結(jié)果婚禮上础拨,老公的妹妹穿的比我還像新娘。我一直安慰自己绍载,他們只是感情好诡宗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著击儡,像睡著了一般塔沃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阳谍,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天蛀柴,我揣著相機(jī)與錄音螃概,去河邊找鬼。 笑死鸽疾,一個(gè)胖子當(dāng)著我的面吹牛吊洼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播制肮,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冒窍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弄企?” 一聲冷哼從身側(cè)響起超燃,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拘领,沒(méi)想到半個(gè)月后意乓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡约素,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年届良,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圣猎。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡士葫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送悔,到底是詐尸還是另有隱情慢显,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布欠啤,位于F島的核電站荚藻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洁段。R本人自食惡果不足惜应狱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祠丝。 院中可真熱鬧疾呻,春花似錦、人聲如沸写半。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叠蝇。三九已至璃岳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾睦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炎功,地道東北人枚冗。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛇损,于是被迫代替她去往敵國(guó)和親赁温。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一. CocoaPods的介紹 什么是CocoaPods淤齐?CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開(kāi)源庫(kù)...
    輝712閱讀 3,926評(píng)論 0 7
  • 本文翻譯自官方的Podfile Syntax Reference,也參考了之前一位博主的翻譯股囊,若翻譯中有什么異議,...
    Tasselx閱讀 69,566評(píng)論 10 194
  • 項(xiàng)目組件化更啄、平臺(tái)化是技術(shù)公司的共同目標(biāo)稚疹,越來(lái)越多的技術(shù)公司推崇使用pod管理第三方庫(kù)以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 21,749評(píng)論 0 39
  • 轉(zhuǎn)載自:http://blog.csdn.net/qitianjin/article/details/517738...
    YYT1992閱讀 2,640評(píng)論 0 0
  • 經(jīng)常使用CocoaPods來(lái)管理iOS項(xiàng)目中的第三方庫(kù)祭务,但是我們要使用CocoaPods來(lái)管理第三方庫(kù)内狗,前提是要寫(xiě)...
    qitianjin閱讀 1,355評(píng)論 2 0