参考网址 http://guides.cocoapods.org
成文的环境
安装需要gem包管理器
在shell中执行
$ sudo gem install cocoapods
安装后,可以查看pod版本,输出正常,则安装完成
$ pod --version
和现有工程集成,使用空podfile,是一个简单有效的方法。
在现有工程的工程文件目录中,添加Podfile
platform :ios, '8.0' # 平台ios,最小依赖 8.0
#下面两行是一个整体代码块
target 'myApp' do # myApp需替换成自己的target
end
保存podfile文件,将其放在工程文件同目录,打开shell执行
$ pod install
执行完毕后,一般会多出些文件和文件夹:myApp.xcworkspace
、Podfile.lock
、Pods
。
之后,就可以打开myApp.xcworkspace
管理现有工程了
如果现有工程已经有了xxxx.xcworkspace
文件怎么办?
也很简单,在空Podfile上稍微修改即可
添加workspace 'abcd.xcworkspace'
workspace 'abcd.xcworkspace' #abcd为已经存在的工程文件
platform :ios, '8.0' # 平台ios,最小依赖 8.0
#下面两行是一个整体代码块
target 'myApp' do # myApp需替换成自己的target
end
然后执行
$ pod install
空Podfile建立后,就可以添加依赖库了,以AFNetworking
为例
在空Podfile基础上,添加依赖库 pd 库名 版本
platform :ios, '8.0'
target 'myApp' do
pod 'AFNetworking', '~> 3.2.1' #版本为3.2.1 - 3.3之间,不包括3.3
#pod 'AFNetworking', '= 3.2.1' #指定使用3.2.1
end
然后执行 pod install
$ pod install
指令 pod
例如 pod 'AFNetworking'
,pod 'AFNetworking', '~> 3.2.1'
podspec
通常,一个Pod库目录下只要一个podspec文件,在有多个的情况下,CocoaPod将使用找到的第一个podspec文件;你也可以指定使用哪一个podspec文件
podspec :name => 'QuickDialog'
或
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
指令为 use_frameworks!
platform :ios, '8.0'
target 'myApp' do
use_frameworks! #将依赖库以framework形式引入
pod 'AFNetworking', '~> 3.2.1'
end
cocoapod的版本号规则遵循 semantic versioning
可以不指定依赖库的版本,如下
platform :ios, '8.0'
target 'myApp' do
pod 'AFNetworking'
end
如果指定,规则如下:
'> 0.1'
任何大于0.1的版本 (不包含0.1)'>= 0.1'
任何大于等于0.1的版本 (包含0.1)'< 0.1'
任何小于0.1的版本(不包含0.1)'<= 0.1'
任何小于等于0.1的版本 (包含0.1)cocoapod额外提供的版本号操作符 ~>
:
'~> 0.1.2'
从0.1.2(含)到 0.2(不含)之间的任何版本,不包含高于0.2的版本'~> 0.1'
从0.1(含) 到 1.0(不含)之间的任何版本, 不包含高于1.0的版本'~> 0'
0或者高于0的任何版本指令 inhibit_all_warnings!
platform :ios, '8.0'
nhibit_all_warnings!
target 'myApp' do
pod 'AFNetworking', '~> 3.2.1'
end
指令 inhibit_warnings
,优先级高于 inhibit_all_warnings!
例如:
target 'myApp' do
pod 'SSZipArchive', :inhibit_warnings => true #true 忽略警告
pod 'AFNetworking', :inhibit_warnings => false #false 输出警告
end
默认情况,依赖的构建配置和target的配置保持一致
如果出于调试,或者其他原因,可以单独给依赖库设置
指定多个配置
pod 'AFNetworking', :configurations => ['Debug', 'Beta']
指定一个
pod 'AFNetworking', :configuration => 'Debug'
configurations
和 configuration
use_modular_headers!
(全局)
:modular_headers => true
(单个Pod,优先级高于全局)
:modular_headers => fasle
(单个Pod,优先级高于全局)
例如
pod 'AFNetworking', :modular_headers => true
platform :ios, '8.0'
target 'myApp' do
use_frameworks!
pod 'AFNetworking', :modular_headers => true
end
source
例如 pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
path
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
以git仓库为例:
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 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
target的名字应该和xcode工程中的名字保持一致
#定义ZipApp,ZipApp依赖SSZipArchive
target 'ZipApp' do
pod 'SSZipArchive'
end
默认情况下,target会继承在自身外面的依赖项,若不想继承需要使用inherit!
指令(参见 inherit! 依赖继承)
target 'ZipApp' do
pod 'SSZipArchive'
target 'ZipAppTests' do #ZipAppTests需要继续ZipApp的依赖,即也依赖 SSZipArchive
pod 'Nimble'
end
end
inherit! 依赖继承 可用模式如下:
inherit! : complete
继承父项的所有行为inherit! : none
不会继承父项的任何行为inherit! : search_paths
仅继承父项的搜索路径target 'App' do
target 'AppTests' do
inherit! :search_paths
end
end
script_phase
给指定的target的添加脚本,该脚本可以访问xcode环境变量,在Xcode执行编译时被调用。
可在xcode的target->Build Phases中查看
target 'myApp' do
script_phase :name => 'HelloWorldScript1', :script => 'echo "Hello World"'
script_phase :name => 'HelloWorldScript2', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
end
上面的示例执行pod install后,在xcode的target->Build Phases中查看
abstract_target
一般情况下,target
必须和xcode工程中的target名字保持一致,而abstract_target
则不必这样。
abstract_target
主要是为了方便管理依赖项继承。
一个应用场景就是,xcode中的多个target都依赖相同的三方库,则可以使用抽象target来管理
abstract_target 'ABC' do
pod 'libA'
pod 'libB'
pod 'libC'
target 'XXX' do # xxx同时依赖 libA、libB、libC、libD
pod 'libD'
end
target 'YYY' do # xxx同时依赖 libA、libB、libC、libE
pod 'libE'
end
end
为CocoaPod 1.0之前的指令,请使用abstract_target
abstract!
表示当前target是抽象的,因此不会直接链接到Xcode目标(target)中。
target 'ABC' do
abstract!
pod 'libA'
pod 'libB'
pod 'libC'
target 'XXX' do # xxx同时依赖 libA、libB、libC、libD
pod 'libD'
end
target 'YYY' do # xxx同时依赖 libA、libB、libC、libE
pod 'libE'
end
end
platform
例如
platform :ios # 合法的平台 osx ,ios ,tvos,watchos
默认情况下,各个平台对应的版本
platform :ios, 4.0
platform :osx, 10.0
platform :tvOS, 9.0
platform :watchos, 2.0
指定哪些xcode project需要使用链接Pods库
Podfile文件所在目录如果只有一个xcode project文件,那么在不指定project的情况下,和Podfile文件同目录下的那个唯一一个xcode project文件将被使用。
在有多个xcode project文件时,使用project
指定需要的工程项目,例如
target 'myApp_123' do
project './myApp_123' #或者添加扩展名 ./myApp_123.xcodeproj
end
target 'myApp_456' do
project './myApp_456'
end
还可以指定构建配置,例如
target 'myApp' do
project './myApp_123', '发布的Target' => :release, '测试的Target' => :debug
end
为CocoaPod 1.0之前的指令,行为同project
workspace 'MyWorkspace'
source
CocoaPods Master Repository #官方的源
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
在不指定任何源情况下,CocoaPods将使用隐含的官方源;如果指定了其他源,那么这个隐含的官方源需要显式指定(如果不使用官方源,可以不指定);
源的优先级和顺序相关,第一个源优先级最高;
CocoaPods将使用包含Pod的第一个源的Pod的最高版本(无论其他源是否具有更高版本)