1、Root specification
根规范“根”规范存储有关库的特定版本的信息。此组中的属性只能写入“根”规范,而不是“子规范”。在这个组中列出的属性是podspec需要的唯一属性。其他组的属性被用来改进podspec并遵循一个关于配置方法的约定。根规范可以直接通过“sub-specifications”来描述这些属性。
license 必须
pod库的许可证。除非源文件包含一个名为LICENSE.* or LICENCE.*的文件,否则许可证文件的路径或通常用于许可证类型的公告完整文本,必须指定。许可证文件可以没有文件扩展名也可以是txt, md, 或是markdown,
#许可证默认与spec文件在同一目录下
#MIT是一个比较宽泛的开源许可协议
spec.license = 'MIT'
#指定许可文件
spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' }
spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => spec.version.to_s }
以下的方式,项目中没有用到,不能过多的解释,更多参照
source
#使用v前缀的tag值和子模块
spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git', :tag => "v#{spec.version}", :submodules => true }
#使用svn源
spec.source = { :svn => 'http://svn.code.sf.net/p/polyclipping/code', :tag => '4.8.8' }
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip' }
#使用
HTTP下载文件,使用hash来验证下载。它支持sha1和sha256。
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip',:sha1 => '7e21857fe11a511f472cfd7cfa2d979bd7ab7d96' }
支持的key:
:git => :tag, :branch, :commit, :submodules
:svn => :folder, :tag, :revision
:hg => :revision
:http => :flatten, :type, :sha256, :sha1
:path
prepare_command
在Pod下载完之后将执行的bash脚本。该命令可用于创建、删除和修改任何下载的文件。
这个命令是在Pod被清理之前且创建Pod项目之前执行的。工作目录是Pod的根目录。
如果是使用:path安装的pod,这个命令将不会被执行。
# 指定脚本文件,ruby build_files.rb是脚本文件名
spec.prepare_command = 'ruby build_files.rb'
这里用到了
ruby命令
#sed命令是利用script来处理文本文件
#i :插入
#s :取代
#sed
's/要被取代的字串/新的字串/g'
#第一个sed 语句表示将当前目录下的所有.h文件中的MyNameSpacedHeader替换成Header
spec.prepare_command = <<-CMD
sed -i 's/MyNameSpacedHeader/Header/g' ./**/*.h
sed -i 's/MyNameOtherSpacedHeader/OtherHeader/g' ./**/*.h
支持多平台
这个会添加到最终target 的xcconfig中,不建议使用,不应该污染用户项目的构建设置,因为这可能导致冲突。
如果导入pod时,需要使用clang编译器标志或预编译器宏定义,最好使用pod_target_xcconfig,这个只会影响你自己的pod target。
spec.user_target_xcconfig = { 'MY_SUBSPEC' => 'YES' }
spec.user_target_xcconfig = { 'MY_SUBSPEC' => 'YES' }
在pod项目的前缀头文件中注入的内容,前缀头文件是模块的pch文件。
spec.prefix_header_contents = '#import <UIKit/UIKit.h>'
spec.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
//可以将多行内容放到两个EOS中间
s.prefix_header_contents = <<-EOS
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
s.prefix_header_contents = <<-EOS
#define HHHH @"测试代码"
prefix_header_contents的内容会写到这个文件中
prefix_header_contents 注入的内容
#包含Classes和More_Classes目录下的所有.h .m文件
spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
通配符*:
* 匹配所有文件
c* 匹配名字以c开头的文件。
*c 匹配名字以c结束的文件。
c 匹配名字含有c的,包含c在开头和结尾的情况。
通配符**:
目录递归地匹配。也就是包含子目录
通配符?:
匹配任何一个字符
与正则中 /.{1}/ 一致
通配符[set]:
匹配多个字符。匹配在字符集中的任何一个字符。
跟正则中的字符集一样,也可以取反 [^a-z]
通配符{p,q}:
匹配文件名包含p或q的,可以写两个或多个字
通配符\:跳过下一个元字符
#以JSONKit为例
"JSONKit.?" #=> ["JSONKit.h", "JSONKit.m"]
"*.[a-z][a-z]" #=> ["CHANGELOG.md", "README.md"]
"*.[^m]*" #=> ["JSONKit.h"]
"*.{h,m}" #=> ["JSONKit.h", "JSONKit.m"]
"*" #=> ["CHANGELOG.md", "JSONKit.h", "JSONKit.m", "README.md"]
resource_bundles
pod中的资源会以bundle的形式添加到项目中。键表示bundles的名称,值表示文件格式。
推荐使用,bundle的名称应该包括Pod的名称,以尽量减少名称冲突的几率。
为了提供不同的资源,每个平台都必须使用带有名称空间的包。
spec.ios.resource_bundle = { 'MapBox' => 'MapView/Map/Resources/*.png' }
#多个路径
spec.resource_bundles = {
'MapBox' => ['MapView/Map/Resources/*.png'],
'OtherResources' => ['MapView/Map/OtherResources/*.png']
使用此属性指定的资源直接复制到客户端目标,因此不会被Xcode优化,推荐使用resource_bundles
spec.resource = 'Resources/HockeySDK.bundle'
#多个,注意是resources复数形式,也可以不加[ ]
spec.resources = ['Images/*.png', 'Sounds/*']
module_map
pod被组装成framework的时候module map文件可能用的上,默认的cocoapod会基于public headers 创建一个module map。
spec.module_map = 'source/module.modulemap'
另一方面,“子规范”继承了父属性的值,因此可以在父类中指定属性的共同值。
#安装ShareKit,会包括ShareKit / Evernote,ShareKit / Facebook等,因为它们被定义为subspecs。
pod 'ShareKit', '2.0'
#只安装ShareKit中的某个子库,这种情况下subspec需要源文件,依赖和其他在根spec中定义的属性,不过cocoapods能帮我们处理这些问题。
pod 'ShareKit/Twitter', '2.0'
pod 'ShareKit/Pinboard', '2.0'
#有不同源文件的
subspec subspec 'Twitter' do |sp|
sp.source_files = 'Classes/Twitter'
end
subspec 'Pinboard' do |sp|
sp.source_files = 'Classes/Pinboard'
end
s.subspec 'Core' do |cs|
cs.dependency 'RestKit/ObjectMapping'
cs.dependency 'RestKit/Network'
cs.dependency 'RestKit/CoreData'
s.subspec 'ObjectMapping' do |os|
default_subspecs
一组用来作为依赖项的subspec名称。如果没有指定则要求其所有的subspec作为依赖项。
默认情况下pod库应该提供完整的库。用户可以根据需求微调他们的依赖项,排除不需要的子模块(subspec)。
这个属性很少用。
spec.default_subspec = 'Core'
spec.default_subspecs = 'Core', 'UI'
spec.ios.resources = 'Resources_ios/**/*.png'
spec.osx.source_files = 'Classes/osx/**/*.{h,m}'
spec.tvos.source_files = 'Classes/tvos/**/*.{h,m}'
spec.watchos.source_files = 'Classes/watchos/**/*.{h,m}'
至此,只是对官方文档的简单翻译,更多的可以参照ruby语法。
CocoaPods官网