长时间不写Podspec文件,容易忘记里面的一些属性含义,因此本文把 官方Podspec语法v1.9.0 翻译出来而且加上了一部分本身的理解,方便后续在用到的时候能够直接拿过来看。html
CocoaPods版本升级后会保持对本文进行更新。ios
root规范存储了相关库特定版本的信息。git
下面的属性只能写在root规范上,而不能写在“sub-spec”上。github
spec.name = 'AFNetworking'
pod search 搜索的关键词,这里必定要和.podspec的名称同样,不然会报错;shell
spec.version = '0.0.1'
Pod最新的版本。swift
spec.author = 'Darth Vader' spec.authors = 'Darth Vader', 'Wookiee' spec.authors = { 'Darth Vader' => 'darthvader@darkside.com', 'Wookiee' => 'wookiee@aggrrttaaggrrt.com' }
库维护者(而不是Podspec维护者)的名称和电子邮件地址。xcode
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的许可证ruby
除非源中包含一个名为LICENSE.*
或LICENCE.*
的文件,不然必须指定许可证文件的路径或一般用于许可证类型的通知的完整文本。若是指定了许可文件,它要么必须是没有文件扩展名或者是一个txt
,md
或markdown
。bash
spec.homepage = 'http://www.example.com'
Pod主页的URLmarkdown
检索库的位置
一、使用标签指定Git来源。多数Podspecs是这样写的。
spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => spec.version.to_s }
二、使用以'v'和子模块为前缀的标签。
spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git', :tag => "v#{spec.version}", :submodules => true }
三、使用带标记的Subversion。
spec.source = { :svn => 'http://svn.code.sf.net/p/polyclipping/code', :tag => '4.8.8' }
四、使用与规范的语义版本字符串相同版本的Mercurial。
spec.source = { :hg => 'https://bitbucket.org/dcutting/hyperbek', :revision => "#{s.version}" }
五、使用HTTP下载代码的压缩文件。它支持zip,tgz,bz2,txz和tar。
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip' }
六、使用HTTP下载文件,并使用哈希来验证下载。它支持sha1和sha256。
spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip', :sha1 => '7e21857fe11a511f472cfd7cfa2d979bd7ab7d96' }
咱们通常比较经常使用的就是方式1了,也有2和3
spec.summary = 'Computes the meaning of life.'
简短说明(最多140个字符),该摘要应适当大写并包含正确的标点符号。
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编译器可能不会彻底承认它。
咱们通常是直接指定版本
spec.cocoapods_version = '>= 0.36'
所支持的CocoaPods版本,好比某个属性,是某个cocoapods版本以上才有的,这个时候进行依赖安装,就须要指定版本。
spec.social_media_url = 'https://twitter.com/cocoapods' spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'
Pod、CocoaPods Web服务的社交媒体联系人的URL可使用此URL。
spec.description = <<-DESC Computes the meaning of life. Features: 1. Is self aware ... 42. Likes candies. DESC
比摘要更详细的说明,用这个字段
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
格式。
spec.documentation_url = 'http://www.example.com/docs.html'
Pod文档的可选URL,CocoaPods网络媒体资源将使用该URL。将其保留为空白将默认为您的库CocoaDocs生成URL。
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
选件,则不会执行此命令。
spec.static_framework = true
use_frameworks!若是指定,则pod应当包含静态库框架。
spec.deprecated = true
是否已废弃该库。
spec.deprecated_in_favor_of = 'NewMoreAwesomePod'
不支持使用的Pod名称。
主要是指明支持当前库的平台和相应的部署target。
spec.platform = :osx, '10.8' spec.platform = :ios spec.platform = :osx
支持此Pod的平台。保留此空白表示Pod在全部平台上都支持。当支持多个平台时,应改成使用如下deployment_target。
spec.ios.deployment_target = '6.0' spec.osx.deployment_target = '10.8'
支持平台的最低部署target。
与platform
属性相反,deployment_target
属性容许指定支持该Pod的多个平台-为每一个平台指定不一样的部署目标。
构建环境的配置相关设置
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”的依赖。依赖关系能够指定版本要求。
spec.info_plist = { 'CFBundleIdentifier' => 'com.myorg.MyLib', 'MY_VAR' => 'SOME_VALUE' }
要添加到生成的键值对Info.plist
。
这些值将与CocoaPods生成的默认值合并,从而覆盖全部重复项。
对于库规范,值将合并到为使用框架集成的库生成的Info.plist中。它对静态库无效。
不支持sub-spec(应用和测试spec除外)。
对于应用程序规范,这些值将合并到应用程序主机的中Info.plist
。
对于测试spec,这些值将合并到测试包的中Info.plist
。
# 默认 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
。
spec.ios.framework = 'CFNetwork' spec.frameworks = 'QuartzCore', 'CoreData'
当前target所需系统framework列表
spec.weak_framework = 'Twitter' spec.weak_frameworks = 'Twitter', 'SafariServices'
当前target所需“弱引用”的framework列表
spec.ios.library = 'xml2' spec.libraries = 'xml2', 'z'
当前target所需系统library列表
spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
传递给编译器的flag
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
要添加到最终私有 pod目标xcconfig文件的任何标志。
不推荐使用
不推荐使用
不推荐使用
spec.module_name = 'Three20'
用于该spec的框架/ clang模块的名称,而不是默认的名称(若是设置,则为header_dir,不然为规范名称)。
spec.header_dir = 'Three20Core'
头文件的存储目录。
spec.header_mappings_dir = 'src/include'
用于保留头文件的文件夹结构的目录。若是未提供,则将头文件展平。
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包含任何脚本,则会在安装时向用户显示警告。
文件路径相关设置;不支持遍历父目录
*
匹配全部文件c*
匹配全部以c
开头的文件*c
匹配全部以c
结尾的文件*c*
将匹配其中包含c
的全部文件(包括开头或结尾)spec.source_files = 'Classes/**/*.{h,m}' spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
须要包含的源文件
spec.public_header_files = 'Headers/Public/*.h'
用做公共头的文件模式列表。
这些模式与源文件匹配,以包含将公开给用户项目并从中生成文档的标头。构建库时,这些头将出如今构建目录中。若是未指定公共头,则将source_files中的全部头视为公共。
spec.private_header_files = 'Headers/Private/*.h'
用来标记私有文件模式列表。
这些模式与公共标头(若是未指定公共标头,则与全部标头)匹配,以排除那些不该暴露给用户项目而且不该用于生成文档的标头。构建库时,这些头将出如今构建目录中。
没有列出为公共和私有的头文件将被视为私有,但除此以外根本不会出如今构建目录中。
spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework' spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.framework'
源文件相关联的framework
spec.ios.vendored_library = 'Libraries/libProj4.a' spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
源文件相关联的libraries
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的名称,以最大程度地减小名称冲突的可能性。
spec.resource = 'Resources/HockeySDK.bundle' spec.resources = ['Images/*.png', 'Sounds/*']
复制到target中的资源列表。
为了将Pod构建为静态库,官方建议是使用resource_bundle,由于使用resources属性可能会发生名称冲突。此外,使用此属性指定的资源将直接复制到客户端目标,所以Xcode不会对其进行优化。
spec.ios.exclude_files = 'Classes/osx' spec.exclude_files = 'Classes/**/unused.{h,m}'
从其余文件模式中排除的文件模式列表。
好比在设置某个子模块的时候,不须要包括其中的一些文件,就能够经过这个属性来进行设置。
spec.preserve_path = 'IMPORTANT.txt' spec.preserve_paths = 'Frameworks/*.framework'
任何被下载的文件以后是不会被移除。
默认状况下,CocoaPods会移除全部与其余任何文件模式都不匹配的文件。
spec.module_map = 'source/module.modulemap'
将此Pod集成为框架时应使用的模块映射文件。
默认状况下,CocoaPods基于规范中的公共头建立模块映射文件。
一个库能够指定依赖在另外一个库、另外一个库的子规范或自身的子规范上。
具体看下面这个例子:
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依赖是能够指定具体依赖哪个模块。
spec.default_subspec = 'Core' spec.default_subspecs = 'Core', 'UI' spec.default_subspecs = :none
指定默认的依赖,若是不指定就依赖所有子依赖。
设置支持的某个平台,好比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}'
若是想要知道本身编写的podspec文件是否合法有效,能够经过命令 pod spec lint
进行验证。