一、pod install,pod outdated,pod update 简单介绍
- pod install
- 在项目中第一次使用CocoaPods, 进行安装的时候使用这个命令,在Podfile中增加或删除某个pod后, 也是使用这个命令. 而不是pod update.
- 第一次运行pod install的时候, 会生成podfile.lock文件,.xcworkspace项目和Pods目录还不存在, pod install命令也会创建.xcworkspace和Pods目录, 但这是pod install命令的顺带作用,而不是它的主要作用
- 每次运行pod install命令, 下载并安装新的pod时, 它会为Podfile.lock文件中的每个pod写入已安装的版本. 此文件跟踪每个pod的已安装版本并锁定这些版本。推荐将Podfile.lock文件加入到版本控制中,这样可以保证项目中的成员使用相同版本的pod。
- 当运行pod install,它只解析Podfile.lock中尚未列在其中的pod的依赖库.
- 对于已经在Podfile.lock中列出的pod, Podfile.lock不会尝试检查是否有更新的版本.
- 对于尚未在Podfile.lock中列出的pod, 会搜索与Podfile(如中所述pod ‘MyPod’, ‘~>1.2’)匹配的版本或最新的版本.
- pod outdated
查看当前项目中所有引用第三方当前版本和最新版本的状态,包括Podfile.lock中已存在的版本
可使用pod update PODNAME 将指定的pod更新到最新版本. - pod update
- pod update PODNAME
当运行pod update PODNAME时, CocoaPods将尝试查找PODNAME更新的pod版本, 会忽略掉Podfile.lock中已经存在的版本 - pod update
如果直接运行pod update, 没有指定PODNAME, CocoaPods会把Podfile中所有的pod都更新到最新版本.(如果已经是最新版本了, 则不更新)
- pod update PODNAME
- 使用场景
- user1创建了一个项目
并且想用A, B, C这3个pod库, 这个时候用pod install安装了这些pod库, 并且假设这3个库的版本号都是1.0.0, 这些版本号等信息会记录在Podfile.lock文件中. - user1添加了新的pod
根据项目的进度需求, 添加了D这个pod库到项目中, 这个时候应该使用pod install去安装D这个库到项目中, 即使在添加D这个库之前, B的版本被维护者更新到了1.1.0, 使用pod install也只会安装D这个库到项目中, 而不会去帮你更新B的版本. 从而不会出现因为B的版本更新后, 假如某些函数过期了, 或者某些函数被移除了, 而导致你被迫需要修改项目代码. - user2加入到项目中
假设团队中新增加了一位基友user2, 他克隆了项目, 并且pod install. (前提是你没有把Pods目录添加到源代码管理中), 如果你将Podfile.lock提交到了版本控制. 那么基友安装后的pod会和你的一模一样, 不会出现他的pod版本比你的高. 即便现在C的版本更新到了1.2.0, 基友安装的也是1.0.0版本. 因为在Podfile.lock中记录的pod C就是1.0.0版本. - 检查pod的新版本 后来, user1想要检查下是否有更新pod的版本. 运行pod outdated, 会告诉你pod B有一个新1.1.0版本, pod C已经是1.2.0版本. user1决定他想要更新pod B, 但不更新pod C. 因此, 他会运行pod update B, 将B从1.0.0版本更新到版本1.1.0(并相应的更新Podfile.lock), 但会将pod C保留在版本中1.0.0(不会将其更新为1.2.0).
- user1创建了一个项目
- 依赖冲突的情况
- podfile或者podspec文件声明的依赖pod库,若没有指定版本默认加载最新版本,这个最新版本不会检索到1.0.0-beta这种格式的测试版本,即使测试版本是最新的。想要使用测试版本只能依赖声明时明确版本,pod '1.0.0-beta'。
- 假如一个工程依赖A,B,C三个仓库,并且A,B 仓库在podspec文件中声明依赖C仓库库,podfile或者podspec文件中都没有指定版本号,默认加载A,B,C最新版本,不会冲突。
- 工程podfile文件或者A,B仓库podspec文件中有指定C的版本号信息,只要出现同一个库出现的指定的版本不一样就会冲突。
二、podfile
- 简单写法
target 'MyApp'
pod 'AFNetworking', '~> 1.0'
- 复杂一点的
# 下面两行是指明依赖库的来源地址
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'
# 说明平台是ios,版本是9.0
platform :ios, '9.0'
# 忽略引入库的所有警告(强迫症者的福音啊)
inhibit_all_warnings!
# 针对MyApp target引入AFNetworking
# 针对MyAppTests target引入OCMock,
target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
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
主配置
指定CocoaPods安装此Podfile时要使用的安装方法和选项。 第一个参数表示要使用的安装方法;下一个参数指示安装选项。 目前唯一被接受的安装方法是'cocoapods',所以你将始终使用这个值作为第一个参数;但是在未来的版本中可能会有更多的安装方法
install! 'cocoapods',
:deterministic_uuids => false,
:integrate_targets => false
还支持其他的选项:
Supported Keys:
:clean
:deduplicate_targets
:deterministic_uuids
:integrate_targets
:lock_pod_sources
:share_schemes_for_development_pods
关于以上的配置,官网也没有一个确切的说明,使用默认,待研究。
Dependencies(依赖项)
Podfile指定每个target的依赖项
pod
指定特定的依赖库podspec
可以提供一个API来创建podspecstarget
通过target指定依赖范围
pod - 指定项目的依赖项
依赖项规范是由Pod的名称和一个可选的版本组合一起。 1> 如果后面不写依赖库的具体版本号,那么cocoapods会默认选取最新版本。如果版本号后面包含-beta 特殊版本,即使最新也无法检索到,需要写依赖库的具体版本号
pod 'SSZipArchive'
2> 如果你想要特定的依赖库的版本,就需要在后面写上具体版本号,格式:
pod 'Objection', '0.9'
3> 也可以指定版本范围
> 0.1
高于0.1版本(不包含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,并且始终是你指定范围内的最新版本。
关于版本形式规范详情请参考下面链接: 语义化版本
Build configurations(编译配置)
默认情况下, 依赖项会被安装在所有target的build configuration中。为了调试或者处于其他原因,依赖项只能在给定的build configuration中被启用。 下面写法指明只有在Debug和Beta模式下才有启用配置
pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
或者,可以弄白名单只指定一个build configurations。
pod 'PonyDebugger', :configuration => 'Debug'
注意:默认情况下如果不指定具体生成配置,那么会包含在所有的配置中,如果你想具体指定就必须手动指明。
Subspecs
一般情况我们会通过依赖库的名称来引入,cocoapods会默认安装依赖库的所有内容。 我们也可以指定安装具体依赖库的某个子模块,例如:
# 仅安装QueryKit库下的Attribute模块
pod 'QueryKit/Attribute'
# 仅安装QueryKit下的Attribute和QuerySet模块
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
Using the files from a local path (使用本地文件)
我们也可以指定依赖库的来源地址。如果我们想引入我们本地的一个库,可以这样写:
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
使用这个选项后,Cocoapods会将给定的文件夹认为是Pod的源,并且在工程中直接引用这些文件。这就意味着你编辑的部分可以保留在CocoaPods安装中,如果我们更新本地AFNetworking里面的代码,cocoapods也会自动更新。
被引用的文件夹可以来自你喜爱的SCM,甚至当前仓库的一个git子模块
注意:Pod的podspec文件也应该被放在这个文件夹当中
From a podspec in the root of a library repository (引用仓库根目录的podspec)
有时我们需要引入依赖库指定的分支或节点,写法如下。
- 引入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中的依赖项通过其他Pods 但是podspec必须存在于仓库的根目录中。
从外部引入podspec引入
podspec可以从另一个源库的地址引入
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
podspec
使用给定podspec文件中定义的代码库的依赖关系。如果没有传入任何参数,podspec优先使用根目录,如果是其他情况必须在后面指明。(一般使用默认设置即可)例如:
# 不指定表示使用根目录下的podspec,默认一般都会放在根目录下
podspec
# 如果podspec的名字与库名不一样,可以通过这样来指定
podspec :name => 'QuickDialog'
# 如果podspec不是在根目录下,那么可以通过:path来指定路径
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
target
在给定的块内定义pod的target(Xcode工程中的target)和指定依赖的范围。一个target应该与Xcode工程的target有关联。默认情况下,target会包含定义在块外的依赖,除非指定不使用inherit!来继承(说的是嵌套的块里的继承问题)
- 定义一个简单target
ZipApp
引入SSZipArchive
库
target 'ZipApp' do
pod 'SSZipArchive'
end
- 定义一个
ZipApp
target仅引入SSZipArchive
库,定义ZipAppTests
target 引入Nimble
的同时也会继承ZipApp
target里面的SSZipArchive
库
target 'ZipApp' do
pod 'SSZipArchive'
target 'ZipAppTests' do
inherit! :search_paths
pod 'Nimble'
end
end
- target块中嵌套多个子块
target 'ShowsApp' do
# ShowsApp 仅仅引入ShowsKit
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
抽象target
定义一个新的抽象目标,它可以方便的用于目标依赖继承。
- 简单写法
abstract_target 'Networking' do
pod 'AlamoFire'
target 'Networking App 1'
target 'Networking App 2'
end
- 定义一种abstract_target包含多个target
# 注意:这是个抽象的target也就是说在工程中并没有这个target引入ShowsKit
abstract_target 'Shows' do
pod 'ShowsKit'
# ShowsiOS target会引入ShowWebAuth库以及继承自Shows的ShowsKit库
target 'ShowsiOS' do
pod 'ShowWebAuth'
end
# ShowsTV target会引入ShowTVAuth库以及继承自Shows的ShowsKit库
target 'ShowsTV' do
pod 'ShowTVAuth'
end
# ShowsTests target引入了Specta和Expecta库,并且指明继承Shows,所以也会引入ShowsKit
target 'ShowsTests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
end
end
abstract! 和 inherit!
- abstract! 指示当前的target是抽象的,因此不会直接链接Xcode target。
- inherit! 设置当前target的继承模式。例如:
target 'App' do
target 'AppTests' do
inherit! :search_paths
end
end
另 :complete 目标从父节点继承所有行为。:none 目标不会从父节点继承任何行为。:search_paths 目标只继承父类的搜索路径。
Target configuration (目标项配置)
使用target 配置来控制的cocoapods生成project。 开始时详细说明您正在使用什么平台上。工程文件里允许您具体说明哪些项目的链接。
platform
platform用于指定应建立的静态库的平台。CocoaPods提供了默认的平台版本配置:
- iOS->4.3
- OS X->10.6
- tvOS->9.0
- watchOS->2.0
如果部署目标需要iOS < 4.3,armv6体系结构将被添加到ARCHS。 例如:
#指定具体平台和版本
platform :ios, '4.0'
platform :ios
project
如果没有显示的project被指定,那么会默认使用target的父target指定的project作为目标。如果如果没有任何一个target指定目标,那么就会使用和Podefile在同一目录下的project。同样也能够指定是否这些设置在release或者debug模式下生效。为了做到这一点,你必须指定一个名字和:release/:debuge关联起来
Examples: Specifying the user project
# MyGPSApp这个target引入的库只能在FastGPS工程中引用
target 'MyGPSApp' do
project 'FastGPS'
...
end
# 原理同上
target 'MyNotesApp' do
project 'FastNotes'
...
end
使用自定义的编译配置
project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
inhibit_all_warnings!(强迫症者的福音)
inhibit_all_warnings! 屏蔽所有来自于cocoapods依赖库的警告。你可以全局定义,也能在子target里面定义,也可以指定某一个库:
# 隐藏SSZipArchive的警告而不隐藏ShowTVAuth的警告
pod 'SSZipArchive', :inhibit_warnings => true
pod 'ShowTVAuth', :inhibit_warnings => false
use_frameworks!
通过指定use_frameworks!要求生成的是framework而不是静态库。 如果使用use_frameworks!命令会在Pods工程下的Frameworks目录下生成依赖库的framework 如果不使用use_frameworks!命令会在Pods工程下的Products目录下生成.a的静态库
Workspace
默认情况下,我们不需要指定,直接使用与Podfile所在目录的工程名一样就可以了。如果要指定另外的名称,而不是使用工程的名称,可以这样指定:
workspace 'MyWorkspace'
Source
source是指定pod的来源。如果不指定source,默认是使用CocoaPods官方的source。(建议使用默认设置)
CocoaPods Master Repository
# 使用其他来源地址
source 'https://github.com/artsy/Specs.git'
# 使用官方默认地址(默认)
source 'https://github.com/CocoaPods/Specs.git'
Hooks
Podfile提供了hook机制,它将在安装过程中调用。hook是全局性的,不存储于每个target中。
Plugin
指定应在安装期间使用的插件。使用此方法指定应在安装期间使用的插件,以及当它被调用时,应传递给插件的选项。例如:
# 指定在安装期间使用cocoapods-keys和slather这两个插件
plugin 'cocoapods-keys', :keyring => 'Eidolon'
plugin 'slather'
pre_install
当我们下载完成,但是还没有安装之时,可以使用hook机制通过pre_install指定要做更改,更改完之后进入安装阶段。 格式如下:
pre_install do |installer|
# 做一些安装之前的更改
end
post_install
当我们安装完成,但是生成的工程还没有写入磁盘之时,我们可以指定要执行的操作。 比如,我们可以在写入磁盘之前,修改一些工程的配置:
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
def
我们还可以通过def命令来声明一个pod集:
def 'CustomPods'
pod 'IQKeyboardManagerSwift'
end
然后,我们就可以在需要引入的target处引入:
target 'MyTarget' do
CustomPods
end
这么写的好处是:如果有多个target,而不同target之间并不全包含,那么可以通过这种方式来分开引入。
三、Podspec
Specification描述了Pod库的一个版本,它包括关于应该从哪里获取源代码、使用什么文件、要应用的构建设置和其他通用元数据(如名称、版本和描述)的详细信息
创建一个简单的Podspec
使用pod lib create name按照github模板创建一个组件库,生成的文件中包含一个Podspec。
或者使用pod spec create name 创建一个Podspec
Podspec编辑完后:
pod lib lint 是只从本地验证你的pod能否通过验证
pod spec lint是从本地和远程验证你的pod能否通过验证 一般都使用这个来验证pod
对于依赖其他库的组件验证时
pod spec lint --sources='私有仓库repo地址,github.com/CocoaPods/S…'
#
# Be sure to run `pod lib lint TryDemo.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'TryDemo' #库名
s.version = '0.1.0' #版本号
s.summary = 'A short description of TryDemo.' # 简单描述
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/liudehua/TryDemo' #组件地址
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' } #建议拷贝git上的 MIT License
s.author = { 'liudehua' => '926745768@qq.com' }
s.source = { :git => 'https://github.com/liudehua/TryDemo.git', :tag => s.version.to_s } #组件source地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '9.0'
s.source_files = 'TryDemo/Classes/**/*' #组件中资源文件路径
# s.resource_bundles = {
# 'TryDemo' => ['TryDemo/Assets/*.png'] #组件中资源bundle路径
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3' #组件赖库
# s.dependency 'AFNetworking', '~> 2.3', :configurations => ['Debug'] #依赖组件选择在特定的build configurations条件下执行
end
Root specification相关
root规范存储了相关库特定版本的信息。
下面的属性只能写在root规范上,而不能写在“sub-spec”上。
1、必须的字段
. name
spec.name = 'AFNetworking'
pod search 搜索的关键词,这里一定要和.podspec的名称一样,否则会报错;
. version
spec.version = '0.0.1'
Pod的版本。
. authors
spec.author = 'Darth Vader'
spec.authors = 'Darth Vader', 'Wookiee'
spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
'Wookiee' => 'wookiee@aggrrttaaggrrt.com' }
库维护者(而不是Podspec维护者)的名称和电子邮件地址。
. license
spec.license = 'MIT'
spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' }
spec.license = { :type => 'MIT', :text => <<-LICENSE
Copyright 2012
Permission is granted to...
LICENSE
}
Pod的许可证
除非源中包含一个名为LICENSE.*或LICENCE.*的文件,否则必须指定许可证文件的路径或通常用于许可证类型的通知的完整文本。如果指定了许可文件,它要么必须是没有文件扩展名或者是一个txt,md或markdown。
. homepage
spec.homepage = 'http://www.example.com'
Pod主页的URL
. source 检索库的位置
1、使用标签指定Git来源。多数Podspecs是这样写的。
spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
:tag => spec.version.to_s }
2、使用以'v'和子模块为前缀的标签。
spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git',
:tag => "v#{spec.version}", :submodules => true }
3、使用带标记的Subversion。
spec.source = { :svn => 'http://svn.code.sf.net/p/polyclipping/code', :tag => '4.8.8' }
4、使用与规范的语义版本字符串相同版本的Mercurial。
spec.source = { :hg => 'https://bitbucket.org/dcutting/hyperbek', :revision => "#{s.version}" }
5、使用HTTP下载代码的压缩文件。它支持zip,tgz,bz2,txz和tar。
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip' }
6、使用HTTP下载文件,并使用哈希来验证下载。它支持sha1和sha256。
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip',
:sha1 => '7e21857fe11a511f472cfd7cfa2d979bd7ab7d96' }
我们一般比较常用的就是方式1了,也有2和3
. summary
spec.summary = 'Computes the meaning of life.'
简短说明(最多140个字符),该摘要应适当大写并包含正确的标点符号。
2、选填字段
. swift_versions
spec.swift_versions = ['3.0']
spec.swift_versions = ['3.0', '4.0', '4.2']
spec.swift_version = '3.0'
spec.swift_version = '3.0', '4.0'
支持的Swift版本。CocoaPods将版本“ 4”视为“ 4.0”,而不是“ 4.1”或“ 4.2”。
注意 Swift编译器主要接受主要版本,有时会接受次要版本。尽管CocoaPods允许指定次要版本或补丁版本,但Swift编译器可能不会完全认可它。
我们一般是直接指定版本
. cocoapods_version
spec.cocoapods_version = '>= 0.36'
所支持的CocoaPods版本,比如某个属性,是某个cocoapods版本以上才有的,这个时候进行依赖安装,就需要指定版本。
. social_media_url
spec.social_media_url = 'https://twitter.com/cocoapods'
spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'
Pod、CocoaPods Web服务的社交媒体联系人的URL可以使用此URL。
. description
spec.description = <<-DESC
Computes the meaning of life.
Features:
1. Is self aware
...
42. Likes candies.
DESC
比摘要更详细的说明,用这个字段
. screenshots
spec.screenshot = 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png'
spec.screenshots = [ 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png',
'http://dl.dropbox.com/u/378729/MBProgressHUD/2.png' ]
展示Pod图片的网址列表。用于面向UI库。CocoaPods建议使用gif格式。
. documentation_url
spec.documentation_url = 'http://www.example.com/docs.html'
Pod文档的可选URL,CocoaPods网络媒体资源将使用该URL。将其保留为空白将默认为您的库CocoaDocs生成URL。
. prepare_command
spec.prepare_command = 'ruby build_files.rb'
spec.prepare_command = <<-CMD
sed -i 's/MyNameSpacedHeader/Header/g' ./**/*.h
sed -i 's/MyNameOtherSpacedHeader/OtherHeader/g' ./**/*.h
CMD
下载Pod后将执行的bash脚本。该命令可用于创建,删除和修改下载的任何文件,并且将在收集规范其他文件属性的任何路径之前运行。
在清理Pod和创建Pods项目之前,将执行此命令。工作目录是Pod的根目录。
如果pod安装了该:path选件,则不会执行此命令。
. static_framework spec.static_framework = true use_frameworks!如果指定,则pod应当包含静态库框架。
. deprecated
spec.deprecated = true
是否已废弃该库。
. deprecated_in_favor_of
spec.deprecated_in_favor_of = 'NewMoreAwesomePod'
不支持使用的Pod名称。
Platform相关
主要是指明支持当前库的平台和相应的部署target。
. Platform
spec.platform = :osx, '10.8'
spec.platform = :ios
spec.platform = :osx
支持此Pod的平台。保留此空白表示Pod在所有平台上都支持。当支持多个平台时,应改为使用以下deployment_target。
. deployment_target
spec.ios.deployment_target = '6.0'
spec.osx.deployment_target = '10.8'
支持平台的最低部署target。
与platform属性相反,deployment_target 属性允许指定支持该Pod的多个平台-为每个平台指定不同的部署目标。
Build settings相关
构建环境的配置相关设置
. dependency
spec.dependency 'AFNetworking', '~> 1.0'
spec.dependency 'AFNetworking', '~> 1.0', :configurations => ['Debug']
spec.dependency 'AFNetworking', '~> 1.0', :configurations => :debug
spec.dependency 'RestKit/CoreData', '~> 0.20.0'
spec.ios.dependency 'MBProgressHUD', '~> 0.5'
对其他Pod或“sub-spec”的依赖。依赖关系可以指定版本要求。
. info_plist
spec.info_plist = {
'CFBundleIdentifier' => 'com.myorg.MyLib',
'MY_VAR' => 'SOME_VALUE'
}
要添加到生成的键值对Info.plist。
这些值将与CocoaPods生成的默认值合并,从而覆盖所有重复项。
对于库规范,值将合并到为使用框架集成的库生成的Info.plist中。它对静态库无效。
不支持sub-spec(应用和测试spec除外)。
对于应用程序规范,这些值将合并到应用程序主机的中Info.plist。
对于测试spec,这些值将合并到测试包的中Info.plist。
. requires_arc
# 默认
spec.requires_arc = true
# 设置
spec.requires_arc = false
spec.requires_arc = 'Classes/Arc'
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']
允许您指定使用ARC的source_files。它可以是支持ARC的文件,也可以是true,以表示所有source_files都使用ARC。
不使用ARC的文件将带有-fno-objc-arc编译器标志。
此属性的默认值为true。
. frameworks
spec.ios.framework = 'CFNetwork'
spec.frameworks = 'QuartzCore', 'CoreData'
当前target所需系统framework列表
. weak_frameworks
spec.weak_framework = 'Twitter'
spec.weak_frameworks = 'Twitter', 'SafariServices'
当前target所需“弱引用”的framework列表
. libraries
spec.ios.library = 'xml2'
spec.libraries = 'xml2', 'z'
当前target所需系统library列表
. compiler_flags
spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
传递给编译器的flag
. pod_target_xcconfig
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
要添加到最终私有 pod目标xcconfig文件的任何标志。
. module_name
spec.module_name = 'Three20'
用于该spec的框架/ clang模块的名称,而不是默认的名称(如果设置,则为header_dir,否则为规范名称)。
. header_dir
spec.header_dir = 'Three20Core'
头文件的存储目录。
. header_mappings_dir
spec.header_mappings_dir = 'src/include'
用于保留头文件的文件夹结构的目录。如果未提供,则将头文件展平。
. script_phases
spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"' }
spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"', :execution_position => :before_compile }
spec.script_phase = { :name => 'Hello World', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby' }
spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"',
:input_files => ['/path/to/input_file.txt'], :output_files => ['/path/to/output_file.txt']
}
spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"',
:input_file_lists => ['/path/to/input_files.xcfilelist'], :output_file_lists => ['/path/to/output_files.xcfilelist']
}
spec.script_phases = [
{ :name => 'Hello World', :script => 'echo "Hello World"' },
{ :name => 'Hello Ruby World', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby' },
]
此属性允许定义脚本,以作为Pod编译的一部分执行。与prepare命令不同,脚本作为xcodebuild的一部分执行,也可以利用在编译期间设置的所有环境变量。
Pod可以提供要执行的多个脚本,并且将按照声明的顺序添加它们,并考虑它们的执行位置设置。
注意 为了提供对所有脚本内容的可见性和意识,如果安装了Pod包含任何脚本,则会在安装时向用户显示警告。
File patterns相关
文件路径相关设置;不支持遍历父目录
- 匹配所有文件 c* 匹配所有以c开头的文件 *c 匹配所有以c结尾的文件 c 将匹配其中包含c的所有文件(包括开头或结尾) . source_files
spec.source_files = 'Classes/**/*.{h,m}'
spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
需要包含的源文件
. public_header_files
spec.public_header_files = 'Headers/Public/*.h'
用作公共头的文件模式列表。
这些模式与源文件匹配,以包含将公开给用户项目并从中生成文档的标头。构建库时,这些头将出现在构建目录中。如果未指定公共头,则将source_files中的所有头视为公共。
. private_header_files
spec.private_header_files = 'Headers/Private/*.h'
用来标记私有文件模式列表。
这些模式与公共标头(如果未指定公共标头,则与所有标头)匹配,以排除那些不应暴露给用户项目并且不应用于生成文档的标头。构建库时,这些头将出现在构建目录中。
没有列出为公共和私有的头文件将被视为私有,但除此之外根本不会出现在构建目录中。
. vendored_frameworks
spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework'
spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.framework'
源文件相关联的framework
. vendored_libraries
spec.ios.vendored_library = 'Libraries/libProj4.a'
spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
源文件相关联的libraries
. resource_bundles
spec.ios.resource_bundle = { 'MapBox' => 'MapView/Map/Resources/*.png' }
spec.resource_bundles = {
'MapBox' => ['MapView/Map/Resources/*.png'],
'MapBoxOtherResources' => ['MapView/Map/OtherResources/*.png']
}
为了将Pod构建为静态库,官方强烈建议使用此属性来管理资源文件,因为使用resources属性可能会发生名称冲突。
资源文件bundle的名称至少应包括Pod的名称,以最大程度地减少名称冲突的可能性。
. resources
spec.resource = 'Resources/HockeySDK.bundle'
spec.resources = ['Images/*.png', 'Sounds/*']
复制到target中的资源列表。
为了将Pod构建为静态库,官方建议是使用resource_bundle,因为使用resources属性可能会发生名称冲突。此外,使用此属性指定的资源将直接复制到客户端目标,因此Xcode不会对其进行优化。
. exclude_files
spec.ios.exclude_files = 'Classes/osx'
spec.exclude_files = 'Classes/**/unused.{h,m}'
从其他文件模式中排除的文件模式列表。
比如在设置某个子模块的时候,不需要包括其中的一些文件,就可以通过这个属性来进行设置。
. preserve_paths
spec.preserve_path = 'IMPORTANT.txt'
spec.preserve_paths = 'Frameworks/*.framework'
任何被下载的文件之后是不会被移除。
默认情况下,CocoaPods会移除所有与其他任何文件模式都不匹配的文件。
. module_map
spec.module_map = 'source/module.modulemap'
将此Pod集成为框架时应使用的模块映射文件。
默认情况下,CocoaPods基于规范中的公共头创建模块映射文件。
Subspecs相关
一个库可以指定依赖在另一个库、另一个库的子规范或自身的子规范上。
具体看下面这个例子:
pod 'ShareKit', '2.0'
pod 'ShareKit/Twitter', '2.0'
pod 'ShareKit/Pinboard', '2.0'
我们有时候会编写这样的podfile文件,导入第三方或者自己依赖的库;那么它对应的podspec文件应该如何编写呢?
如下:
subspec 'Twitter' do |sp|
sp.source_files = 'Classes/Twitter'
end
subspec 'Pinboard' do |sp|
sp.source_files = 'Classes/Pinboard'
end
这样写就可以了,指定对应的源关联文件或者资源文件即可。
注意一点,就是通过pod search的时候只能是整个模块,即你不能单独搜索里面的子模块,但是我们podfile依赖是可以指定具体依赖哪一个模块。
. default_subspecs
spec.default_subspec = 'Core'
spec.default_subspecs = 'Core', 'UI'
spec.default_subspecs = :none
指定默认的依赖,如果不指定就依赖全部子依赖。
Multi-Platform support
设置支持的某个平台,比如ios、osx、tvos等
spec.ios.source_files = 'Classes/ios/**/*.{h,m}'
spec.osx.source_files = 'Classes/osx/**/*.{h,m}'
spec.osx.source_files = 'Classes/osx/**/*.{h,m}'
spec.tvos.source_files = 'Classes/tvos/**/*.{h,m}'
spec.watchos.source_files = 'Classes/watchos/**/*.{h,m}'