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
④安裝本地依賴(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
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
`
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ě)的伶贰,如果有不正確的地方诱贿,或者是有更深層次的理解娃肿,歡迎留言交流。