Podfile看我就够了
Podfile
Podfile文件是一个描述target的依赖库规范。
一个简单的Podfile文件是这样的:
target 'MyApp' do
pod 'AFNetworking', '~> 1.0'
end
也可以更复杂:
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
install!
通过install!
可以指定安装依赖库的一些选项。
基本语法:
install! + 安装语法 + 安装选项
例如:
install! 'cocoapods',
:deterministic_uuids => false,
:integrate_targets => false
目前安装方法只有cocoapods
这个方法。
安装选项
:clean
安装的时候是否需要删除依赖库未用到的文件。
默认时true
deduplicate_targets
当多个target对一个依赖库有不同的需求时,是否要避免重复。一般是通过添加后缀来避免重复。
默认是true
例如:
target 'MyTargetA' do
pod 'MyPod/SubA'
end
target 'MyTargetB' do
pod 'MyPod'
end
MyTargetA和MyTargetB都引用MyPod库,如果设置成true,就会生成MyPod
和 MyPod-SubA
:deterministic_uuids
创建pods项目时是否生成准确的UUID。默认为true。
但是我们习惯设置为false
:integrate_targets
是否要将安装的依赖库集成到用户的项目中。默认是true。
如果设置成false,依赖库会放到Pods/
,而不会放到用户项目中。
小结
对于以上这些选项,我们一般使用默认就行了。
Dependencies
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,但是不包含0.2.0 -
~> 0.1.3-beta.0
:安装0.1.3的测试版本或release版本
Build configurations
默认情况下,依赖库是安装在所有配置环境下的(如果你配置了FAT、UAT环境)。
但是我们可以指定安装在某些(DEBUFG、UAT)配置环境下:
pod 'PonyDebugger', :configurations => ['DEBUFG', 'UAT']
也可以指定只安装在DEBUFG环境下
pod 'PonyDebugger', :configuration => 'DEBUFG'
Modular Headers
同use_modular_headers
Source
指定安装源
指定某一个依赖库的安装源
pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
也可以全局指定:
source 'http://gitlab.hellokitty.cn/iOSPrivateSpecsRepo.git'
Subspecs
子模块,我们可以通过以下方式安装子模块
安装QueryKit下的Attribute模块。
pod 'QueryKit/Attribute'
安装QueryKit下的Attribute模块和QuerySet模块。
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
Test Specs
安装某个依赖库下的单元测试
pod 'AFNetworking', :testspecs => ['UnitTests', 'SomeOtherTests']
从本地库Pod
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
它会将Documents下的AFNetworking link到pod项目中。
从远程仓库pod
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
从AFNetworking远程仓库pod,当然我们还可以指定它的分支:
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'
指定commit:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
从存储库外的其他源pod
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
通过指定一个http的podspec
podspec
依赖库的配置文件。
安装依赖库的时候,它是从podspec指定的地址去pod的。如果没有参数,则使用podfile根目录中的第一个podspec。
podspec :name => 'QuickDialog'
根据podspec的name去pod。
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
根据本地的podspec去pod。
target
定义一个CocoaPods目标,它将要安装的依赖库限制在一个块中。这个target要跟Xcode的target一致。默认情况下,target包含块以外的所有依赖库,除非指定了inherit!
.
定义一个target
target 'ZipApp' do
pod 'SSZipArchive'
end
通过inherit!
继承的方式来安装SSZipArchive
target 'ZipApp' do
pod 'SSZipArchive'
target 'ZipAppTests' do
inherit! :search_paths
pod 'Nimble'
end
end
ShowsTests安装了Specta和Expecta库,同时还继承了父target的ShowsKit
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
script_phase
给target添加脚本,一个目标可以包含多个脚本,执行顺序按添加顺序执行。
指定脚本名称HelloWorldScript,脚本是打印出hello world
script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World"'
指定脚本名称HelloWorldScript,脚本是打印出hello world,并指出shell_path
script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
abstract_target
定义一个抽象的target方便子target继承依赖
abstract_target 'Networking' do
pod 'AlamoFire'
target 'Networking App 1'
target 'Networking App 2'
end
定义抽象Networking,Networking App 1和Networking App 2,都安装了依赖AlamoFire
定义一个依赖包含多个target
# 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!
指明当前target是抽象的,因此不会直接链接到Xcode目标。
inherit!
它有三种可用mode:
- :complete:所有的都继承于父target
- :none:都不继承父target
- :search_paths:仅仅serach path继承父target
Target configuration
platform
指定依赖库构建在哪个平台上,可以指定ios、osx、tvos、watchos
project
指定一个Xcode project,它包含pod依赖库可以链接到的target
如果没想显示指明project,就使用跟Podfile同一目录的project.
# 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
还可以指定自定义的build configurations(如果配置了多个configurations)
project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
inhibit_all_warnings!
禁止来自依赖库的警告
禁止SSZipArchive的警告
pod 'SSZipArchive', :inhibit_warnings => true
也可以全局配置
use_frameworks!
pod 的依赖库是framework而不是静态库
在Xcode9之前,swift是不支持静态库的,因此,需要是否使用某些依赖库必须要设置use_frameworks!,但是在CocoaPods 1.5.0,开发者不需要在podfile文件中
设置use_frameworks!
use_modular_headers!
对所有cocoapods静态库使用模块化头文件。
例如:
可以在pod B中引入文件A#import "A.h"
,cocoapods将创建构建设置以便能引入成功,但是,如果您尝试将模块映射添加到这些pods中,这样的导入将不起作用。许多年前,我们尝试自动为静态库生成模块映射。
在CocoaPods 1.5.0,可以通过设置use_modular_headers!为所有pod启用更严格的搜索路径和模块映射
不明白的话,可以看这篇文章
Hooks
pre_install
这个hook可以允许你在依赖库下载完之后但是还没安装时对其进行任何更改。
pre_install do |installer|
# Do something fancy!
end
post_install
这个hook允许你在将生成的Xcode项目写入磁盘之前对其进行任何最后的更改,或者执行任何其他您可能想要执行的任务。
为所有的targets自定义build settings
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
supports_swift_versions
指定swift版本
target 'MyApp' do
supports_swift_versions '>= 3.0', '< 4.0'
pod 'AFNetworking', '~> 1.0'
end