目录
- Podfile
- 根选项
- 依赖关系
- 目标配置
- 工作空间
- 源
- 钩子
Podfile
Podfile是描述一个或多个Xcode项目的目标的依赖关系的规范。
Podfile可以非常简单:
target 'MyApp'
pod 'AFNetworking', '~> 1.0'
一个更复杂的Podfile的示例可以是这样:
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
根选项
适用于整个Podfile的配置。
- install! 声明安装过程中要使用的安装方法和选项。
install!
指定CocoaPods安装此Podfile时要使用的安装方法和选项。
第一个参数代表要使用的安装方法。下一个参数代表安装选项。
目前,唯一可接受的安装方法是cocoapods
,因此您将始终使用该值作为第一个参数;但是将来的版本中可能会提供更多安装方法。
例如:
指定自定义CocoaPods安装选项
install! 'cocoapods',
:deterministic_uuids => false,
:integrate_targets => false
支持的Keys:
:clean
在安装过程中是否清洁pod源
清除将删除podspec指定的pod中未使用的任何文件以及项目支持的平台。
此选项默认为true。
:deduplicate_targets
是否对Pod进行重复数据删除
删除重复数据为pod添加后缀,以防止多个不同要求的Target
中包含pod的情况。例如,名为MyPod
子模块为SubA
的容器包含在两个target
中,如下所示:
target 'MyTargetA' do
pod 'MyPod/SubA'
end
target 'MyTargetB' do
pod 'MyPod'
end
将产生两个Pod:MyPod和MyPod-SubA
此选项默认为true。
:deterministic_uuids
创建Pods项目时是否生成确定性UUID
此选项默认为true。
:integrate_targets
是否将已安装的pod集成到用户项目中
如果设置为false,Pod将被下载并安装到Pods/目录中,但不会集成到您的项目中。
此选项默认为true。
:lock_pod_sources
是否锁定Pod的源文件。尝试修改文件内容时,Xcode会提示解锁文件
在安装过程中锁定pod的源文件会降低性能。这样会严重影响pod install项目的耗时,可以尝试将其设置为false
此选项默认为true。
:warn_for_multiple_pod_sources
当多个库包含名称和版本相同的Pod时,是否发出警告
此选项默认为true。
:share_schemes_for_development_pods
是否共享开发pods的Xcode方案(Schemes)。
开发pods的方案(Schemes)是自动创建的,但默认情况下不共享。
此选项默认为false。
:disable_input_output_paths
是否禁用CocoaPods脚本阶段的输入和输出路径(复制框架和复制资源)
此选项默认为false。
:preserve_pod_file_structure
是否保留所有Pod的文件结构,包括外部来源的Pod。
默认情况下,仅为开发Pod保留Pod源的文件结构。设置 :preserve_pod_file_structure
为true将保留文件结构。
此选项默认为false。
:generate_multiple_pod_projects
是否为每个pod目标生成一个项目。而不是创建一个豆荚。xcodeproj,此选项将为嵌套在下方的pod目标生成一个项目Pods.xcodeproj。
此选项默认为false。
:incremental_installation
是否仅启用自上次安装以来已更改的项目及其关联工程。
此选项默认为false。
:skip_pods_project_generation
是否跳过生成Pods.xcodeproj,仅执行依赖关系的解析和下载。
此选项默认为false。
依赖关系
Podfile指定每个工程目标的依赖关系。
-
pod
是声明特定依赖项的方法。 -
podspec
提供了一个用于创建podspec的简单API。 -
target
是如何将依赖关系范围限定到Xcode项目中的特定工程目标中。
pod
指定项目的依赖项。
依赖项需求由Pod的名称和版本需求列表(可选)定义。
当你开始一个项目的时候,你很可能会想使用一个Pod的最新版本。如果是这种情况,只需要省略版本号要求。
pod 'SSZipArchive'
在老项目中,您可能需要指定仓库的特定版本,在这种情况下,您可以指定该仓库的版本号。
pod 'Objection', '0.9'
除了没有版本号或指定特定版本外,你还可以使用运算符:
-
= 0.1
版本0.1。 -
> 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
并且将始终匹配符合您要求的最新已知版本。 -
~> 0.1.3-beta.0Beta
代表0.1.3的发行版本,除0.2以外的发行版本最高为0.2。用破折号(-)分隔的组件将不考虑版本要求。
可以指定特定的版本号,以便于进行更精细的控制。
有关版本控制策略的更多信息,请参见:
- 语义版本控制
- RubyGems版本控制政策
构建配置
默认情况下,依赖关系安装在目标的所有构建配置中。出于调试目的或其他原因,只能在构建配置列表中启用它们。
pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
或者,您可以指定将其包含在单个构建配置中。
pod 'PonyDebugger', :configuration => 'Debug'
请注意,所有配置中都包含了传递依赖项,如果不需要的时候,你必须手动为它们指定相应构建配置。
模块化头(Modular Headers)
如果要在每个Pod中使用模块化头,则可以使用以下语法:
pod 'SSZipArchive', :modular_headers => true
此外,使用use_modular_headers!
属性时,可以使用以下方法从模块化标头中排除特定Pod:
pod 'SSZipArchive', :modular_headers => false
资源
默认情况下,在全局级别指定的源将按照指定依赖项匹配的顺序进行搜索。这种行为可以改变为一个特定的依赖,通过指定的依赖源:
pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
在这种情况下,将只搜索指定的源,以查找依赖项和任何被忽略的全局源。
子模块
通过其名称安装Pod时,它将安装podspec中定义的所有默认子模块。
您可以使用以下方法安装特定的子模块:
pod 'QueryKit/Attribute'
您可以指定要安装的子模块的集合,如下所示:
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
测试模块
可以通过:testspecs
选项选择包含测试规范。默认情况下,不包括Pod的任何测试规格。
您可以使用以下命令指定要安装的测试规范名称的列表:
pod 'AFNetworking', :testspecs => ['UnitTests', 'SomeOtherTests']
提供的值:testspecs
对应test_spec
于Podspec
中提供给 DSL属性的名称。
依赖关系也可以从外部来源获得。
使用本地路径中的文件。
如果您想与其他项目一起开发Pod,可以使用该path选项。
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
使用此选项,CocoaPods将指定的文件夹作为为Pod的根目录,并在Pods项目中直接从那里链接文件。这意味着您所做的编辑将保留在CocoaPods安装中。
引用的文件夹可以是您最喜欢的SCM的签出,甚至可以是当前存储库的git子模块。
注意Pod文件的podspec应该在文件夹中。
从库存储库根目录中的podspec中。
有时您可能想使用Pod的最新版本。或特定版本。如果是这种情况,可以在pod声明中指定。
要使用master
存储库的分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
要使用存储库的另一个分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
要使用存储库的标签:
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对Pod的任何其他依赖。
podspec文件应该位于存储库的根目录中,如果这个库的存储库中还没有podspec文件,那么您必须使用下面小节中列出的方法之一。
来自spec存储库之外的podspec,用于没有podspec的库。
podspec可以从存储库之外的另一个源获得。例如,通过HTTP获得podspec:
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
podspec
只使用给定podspec文件中定义的Pod的依赖项。如果没有传递参数,则使用Podfile根目录中的第一个podspec。它的目的是供给库使用。注意:这并不包括来自podspec的源代码,只包括CocoaPods基础结构。
参数
选项
Hash {Symbol=>String}
加载{Specification}的路径。如果未提供,则使用Podfile目录中的第一个podspec。
例子:
podspec
podspec :name => 'QuickDialog'
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
target
定义CocoaPods 目标在给定块中定义的作用域依赖项。目标应与Xcode目标相对应。默认情况下,目标包含块外部定义的依赖项,除非指示不要继承他们!。
参数
名称
Symbol, String
target名称。
例子:
定义target
target 'ZipApp' do
pod 'SSZipArchive'
end
定义从其父级访问SSZipArchive Pod的测试target
target 'ZipApp' do
pod 'SSZipArchive'
target 'ZipAppTests' do
inherit! :search_paths
pod 'Nimble'
end
end
定义目标通过其父目标将Pod应用于多个target
target 'ShowsApp' do
pod 'ShowsKit'
# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
pod 'ShowTVAuth'
end
# Has its own copy of Specta + Expecta
# and has access to ShowsKit via the app
# that the test target is bundled into
target 'ShowsTests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
end
end
scpipt_phase
添加脚本阶段以与此目标集成。脚本阶段可用于执行任意脚本,该脚本可以在执行期间使用所有Xcode环境变量。一个目标可能包括多个脚本阶段,它们将按照声明的顺序添加。如果先前已添加脚本阶段,则将其有效地从目标中删除。
参数
选项
Hash
此脚本阶段的选项。
例子:
script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World"'
script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
abstract_target
定义一个新的抽象目标,可用于方便目标依赖关系的继承。
参数
名称
Symbol, String
目标名称。
例子:
定义抽象目标
abstract_target 'Networking' do
pod 'AlamoFire'
target 'Networking App 1'
target 'Networking App 2'
end
定义将abstract_target包装Pod到多个目标
# Note: There are no targets called "Shows" in any of this workspace's Xcode projects
abstract_target 'Shows' do
pod 'ShowsKit'
# The target ShowsiOS has its own copy of ShowsKit (inherited) + ShowWebAuth (added here)
target 'ShowsiOS' do
pod 'ShowWebAuth'
end
# The target ShowsTV has its own copy of ShowsKit (inherited) + ShowTVAuth (added here)
target 'ShowsTV' do
pod 'ShowTVAuth'
end
# Our tests target has its own copy of
# our testing frameworks, and has access
# to ShowsKit as well because it is
# a child of the abstract target 'Shows'
target 'ShowsTests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
end
end
abstract!
表示当前目标是抽象的,因此不会直接链接到Xcode target。
inherit!
设置当前target的继承模式。
参数
继承
Symbol
要设置的继承模式。
可用模式: +
:complete
目标从父级继承所有行为。+:none
目标不会从父级继承任何行为。+:search_paths
目标仅继承父级的搜索路径。
例子:
仅继承搜索路径
target 'App' do
target 'AppTests' do
inherit! :search_paths
end
end
目标配置
这些设置用于控制CocoaPods生成的项目。
首先,你只需说明你在哪个平台上工作。xcodeproj
允许您特别声明要与哪个项目链接。
platform
指定应为其构建静态库的平台。
如果未指定CocoaPods,则提供默认部署目标。当前默认值适用4.3于iOS,10.6OS X,9.0tvOS和2.0watchOS。
如果部署目标需要它(iOS < 4.3),armv6 则将体系结构添加到中ARCHS。
参数
名称
Symbol
平台名称可以是
:osx
for OS X,:ios
for iOS,:tvos
for tvOS, or:watchos
for watchOS.
目标
String, Version
可选部署。如果未提供,则将根据平台名称分配默认值。
例子:
指定平台
platform :ios, '4.0'
platform :ios
project
指定包含Pods库链接target的Xcode项目。
如果没有一个目标定义指定一个显式项目,并且与Podfile在同一目录中只有一个项目,则将使用该项目。
还可以指定是在发布版本还是在调试预设之后对自定义构建配置的构建设置进行建模。为此,您需要指定一个哈希,其中每个构建配置的名称都与:release
或:debug
关联。
参数
路径
String
要链接的项目的路径
build_configurations
Hash{String => symbol}
一个哈希表,其中键是Xcode项目中构建配置的名称,而值是指定配置应该基于
:debug
还是:release
配置的符号。如果没有为项目中的配置指定显式映射,则默认为:release
。
例子:
指定用户项目
# This Target can be found in a Xcode project called `FastGPS`
target 'MyGPSApp' do
project 'FastGPS'
...
end
# Same Podfile, multiple Xcodeprojects
target 'MyNotesApp' do
project 'FastNotes'
...
end
使用自定义构建配置
project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
xcodeproj
xcodeproj
在1.0
中已弃用,并已重命名为project
。对于1.0之前的版本,请使用xcodeproj。
link_with
link_with
在1.0
中不推荐使用,abstract_target
而是改为使用目标继承。
inhibit_all_warnings!
禁止来自CocoaPods库的所有警告。
此属性由子目标定义继承。
如果要禁止每个Pod发出警告,则可以使用以下语法:
pod 'SSZipArchive', :inhibit_warnings => true
此外,使用inhibit_all_warnings!
属性时,可以使用以下方法将特定Pod排除在禁止之外:
pod 'SSZipArchive', :inhibit_warnings => false
use_modular_headers!
对所有CocoaPods静态库使用模块化头。
此属性由子目标定义继承。
如果要在每个Pod中使用模块化头,则可以使用以下语法:
pod 'SSZipArchive', :modular_headers => true
此外,使用use_modular_headers!
属性时,可以使用以下方法从模块化标头中排除特定Pod:
pod 'SSZipArchive', :modular_headers => false
use_frameworks!
对Pods使用框架而不是静态库。使用框架时,您也可以指定:linkage 要使用的样式,:static或者:dynamic。
此属性由子目标定义继承。
参数
选项
Boolean, Hash
用于配置打包和链接样式的选项。
例子:
target 'MyApp' do
use_frameworks!
pod 'AFNetworking', '~> 1.0'
end
target 'MyApp' do
use_frameworks! :linkage => :dynamic
pod 'AFNetworking', '~> 1.0'
end
target 'ZipApp' do
use_frameworks! :linkage => :static
pod 'SSZipArchive'
end
supports_swift_versions
指定此目标定义支持的Swift版本。
注意,这些需求是从父级继承的,如果指定了这些需求,并且在根级没有指定这些需求,那么所有版本都被认为是受支持的。
参数
要求
String, Version, Array, Array
此目标支持的需求集。
例子:
target 'MyApp' do
supports_swift_versions '>= 3.0', '< 4.0'
pod 'AFNetworking', '~> 1.0'
end
supports_swift_versions '>= 3.0', '< 4.0'
target 'MyApp' do
pod 'AFNetworking', '~> 1.0'
end
target 'ZipApp' do
pod 'SSZipArchive'
end
工作空间
该模块列出了用于配置工作区域(Workspace)和设置全局设置的选项。
workspace
指定应包含所有项目的Xcode工作空间(Workspace)。
如果未指定详细的Xcode工作空间(Workspace),并且只有一个项目与Podfile位于同级目录中,那么该项目的名称将用作工作空间的名称。
参数
路径
字符串
工作区的路径。
例子:
指定工作空间
workspace 'MyWorkspace'
generate_bridge_support!
指定一个BridgeSupport元数据文档应该从所有安装的Pods的头文件生成。
这适用于脚本语言,例如MacRuby
, Nu
和 JSCocoa
,用它来桥接类型、功能等。
set_arc_compatibility_flag!
指定-fobjc-arc标志应添加到中OTHER_LD_FLAGS
。
这被用作非ARC项目编译器错误的解决方法(请参见#142)。这最初是自动完成的,但是从Xcode 4.3.2开始libtool似乎不再支持-fobjc arc标志。因此,现在必须使用此方法显式启用它。
在CocoaPods 1.0中可能不再支持这种方法。
源
Podfile从指定的仓库来源(存储库)列表中检索仓库。
仓库来源是全局的,不会根据每个target去存储它。
source
指定仓库的位置
使用此方法可以指定仓库的来源。来源的顺序是有影响的。CocoaPods将使用包括Pod在内的第一个来源的最高版本(不管其他仓库源是否有更高版本)。
官方的CocoaPods来源是隐式的。一旦指定了其他来源,则需要将其包括在内。
参数
源
String
仓库存储的URL。
例子:
指定首先使用Artsy存储库,然后再使用CocoaPods主存储库
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
钩子
Podfile提供了在安装过程中提供的hook。
hook是全局
的,不按目标定义存储。
plugin
插件
指定安装期间应使用的插件。
使用此方法指定在安装期间应使用的插件,以及在调用插件时应传递给插件的选项。
参数
名称
String
插件的名称。
选项
Hash
调用其挂钩时应传递给插件的可选选项。
例子:
指定使用
slather
和cocoapods-keys
插件。
plugin 'cocoapods-keys', :keyring => 'Eidolon'
plugin 'slather'
pre_install
预安装
此hook可让您在Pod下载之后,在安装之前对Pod进行任何更改。
它接收Pod::Installer
作为唯一参数。
例子:
在Podfile中定义预安装挂钩(pre_install)。
pre_install do |installer|
# Do something fancy!
end
post_install
通过此hook,您可以在将生成的Xcode项目写入磁盘之前,对其进行最后的更改,或者执行其他可能要执行的任务。
它接收Pod::Installer
作为唯一参数。
例子:
自定义所有targets的构建设置
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
参考文档
- Podfile Syntax Reference