1. Specification (标准)
Specification
描绘了关于Pod库一切配置。包括从何处获取源代码、运用哪些文件、运用构建设置以及其他一般元数据(如称号、版别和描绘)的具体信息。
能够直接运用pod spec create
指令来为已有组件项目生成一个.podspec
文件。可是一般咱们创立组件时都会运用pod lib init
指令,会一起生成.podspec
文件。
来看一个比较简单的.podspec
文件,内容如下:
Pod::Spec.new do |spec|
spec.name = 'Reachability'
spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.source_files = 'Reachability.{h,m}'
spec.framework = 'SystemConfiguration'
end
再看一个比较具体的,内容如下:
Pod::Spec.new do |spec|
spec.name = 'Reachability'
spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.module_name = 'Rich'
spec.swift_version = '4.0'
spec.ios.deployment_target = '9.0'
spec.osx.deployment_target = '10.10'
spec.source_files = 'Reachability/common/*.swift'
spec.ios.source_files = 'Reachability/ios/*.swift', 'Reachability/extensions/*.swift'
spec.osx.source_files = 'Reachability/osx/*.swift'
spec.framework = 'SystemConfiguration'
spec.ios.framework = 'UIKit'
spec.osx.framework = 'AppKit'
spec.dependency 'SomeOtherPod'
end
有一些是咱们常见的,有的是还没有见过的,这次都来了解并学习一下。
2. Root specification (根标准)
Root specification
运用于整个pod库,包括分为必填和选填项。
选项 | 是否必填 | 描绘 |
---|---|---|
name | 必填 | 库的姓名 |
version | 必填 | 库的版别号 |
swift_versions | 选填 | 支撑的Swift版别 |
cocoapods_version | 选填 | 支撑的cocoapods版别 |
authors | 必填 | 作者信息 |
social_media_url | 选填 | 作者第三方交际渠道url |
license | 必填 | 许可证 |
homepage | 必填 | pod主页地址 |
readme | 选填 | readme文件地址 |
changelog | 选填 | changelog文件地址 |
source | 必填 | 源文件地址 |
summary | 必填 | 库描绘 |
description | 选填 | 库具体描绘 |
screenshots | 选填 | 库的截图 |
documentation_url | 选填 | 库的文档url |
prepare_command | 选填 | 在装置前履行的脚本 |
static_framework | 选填 | 是否是静态framework的形式 |
deprecated | 选填 | 符号库是否被抛弃 |
deprecated_in_favor_of | 选填 | 标明库的姓名被抛弃 |
2.1 name (必填)
pod
库的姓名,咱们搜索和导入的时分都会用到姓名。
spec.name = 'AFNetworking'
2.2 version(必填)
pod
库的版别号,一般都会和打的标签保持一致。
spec.version = '0.0.1'
2.3 swift_versions(选填)
标准支撑的Swift版别。CocoaPods会将“4”视为“4.0”,而不是“4.1”或“4.2”。
留意:Swift编译器首要承受主版别,有时也会支撑小版别。虽然CocoaPods答应指定小版别或补丁版别,但Swift编译器或许不会彻底遵守。
# 支撑多种写法
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'
2.4 cocoapods_version(选填)
标准支撑的CocoaPods版别。
spec.cocoapods_version = '>= 0.36'
2.5 authors(必填)
spec.author = 'Darth Vader'
spec.authors = 'Darth Vader', 'Wookiee'
spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
'Wookiee' => 'wookiee@aggrrttaaggrrt.com' }
2.6 social_media_url(必填)
Pod的交际媒体联系人的URL, CocoaPods网络服务能够运用这个。
spec.social_media_url = 'https://twitter.com/cocoapods'
spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'
2.7 license (必填)
Pod许可证。
spec.license = 'MIT'
spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' }
spec.license = { :type => 'MIT', :text => <<-LICENSE
Copyright 2012
Permission is granted to...
LICENSE
}
2.8 homepage (必填)
Pod主页的URL。
spec.homepage = 'http://www.example.com'
2.9 readme(选填)
此pod版别的README markdown文件的URL。
spec.readme = 'https://www.example.com/Pod-1.5-README.md'
2.10 changelog(选填)
此pod版别的CHANGELOG markdown文件的URL。
spec.changelog = 'https://www.example.com/Pod-1.5-CHANGELOG.md'
2.11 source(选填)
应该从何处检索库的方位。
- 运用
tag
指定一个Git源文件,比较常用:
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 }
还有一些不常用的,比如支撑下载zip文件,能够从官网上看到。
支撑的keys:
:git => :tag, :branch, :commit, :submodules
:svn => :folder, :tag, :revision
:hg => :revision
:http => :flatten, :type, :sha256, :sha1, :headers
2.12 summary(选填)
对Pod的简略描绘(最多140个字符)。
spec.summary = 'Computes the meaning of life.'
2.13 description(选填)
对Pod的描绘比summary
更具体。
spec.description = <<-DESC
Computes the meaning of life.
Features:
1. Is self aware
...
42. Likes candies.
DESC
2.14 screenshots(选填)
展现Pod截图的url列表。CocoaPods推荐运用gif格局。
spec.screenshot = ''
spec.screenshots = [ '',
'' ]
2.15 documentation_url(选填)
一个可选的Pod文档URL,默以为CocoaDocs生成的库URL。
spec.documentation_url = 'http://www.example.com/docs.html'
2.16 prepare_command(选填)
下载Pod后履行的bash脚本。该指令可用于创立、删去和修改下载的任何文件,而且将在该标准的其他文件特点的任何途径被搜集之前运行该指令。
此指令在清理Pod和创立Pod project项目之前履行。作业目录为Pod的根目录。
假如pod导入时运用了:path选项,则不会履行此指令。
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
2.17 static_framework(选填)
假如use_frameworks!指守时,pod应该包括一个静态库framework。
spec.static_framework = true
2.18 deprecated(选填)
符号库是否现已抛弃不用。
spec.deprecated = true
2.19 deprecated_in_favor_of(选填)
这个Pod库的姓名现已被弃用了。
spec.deprecated_in_favor_of = 'NewMoreAwesomePod'
3. Platform
标准应该指明支撑库的渠道和相应的部署方针。
3.1 platform
支撑当前Pod库的渠道。不填则表明一切渠道都支撑该Pod库。当支撑多个渠道时,你应该运用下面的deployment_target
。
spec.platform = :osx, '10.8'
spec.platform = :ios
spec.platform = :osx
3.2 deployment_target
支撑platform
的最小部署方针。
与platform
特点相反,deployment_target
特点答应指定支撑此pod的多个渠道,便是为每个platform
指定不同的部署方针。
spec.ios.deployment_target = '6.0'
spec.osx.deployment_target = '10.8'
4. Build settings
在该组中列出了与运用构建环境配置相关的特点。
4.1 dependency
标明对其他pod库或者子库的依靠。
假如这儿指定版别过于严厉,会限制它们与其他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'
4.2 info_plist (multi-platform)
要增加到生成的Info.plist中的键值对。
关于library specs
,这些值将合并到生成的framework的Info.plist中
,它对静态库没有影响,不支撑subspecs
。关于app specs
,这些值将合并到主运用的Info.plist中。
spec.info_plist = {
'CFBundleIdentifier' => 'com.myorg.MyLib',
'MY_VAR' => 'SOME_VALUE'
}
4.3 requires_arc (默以为true)
requires_arc
答应指定哪些source_files
运用ARC。能够设置为true表明一切source_files运用ARC。不运用ARC的文件会有-fno-objc-arc
编译标志。
spec.requires_arc = true
spec.requires_arc = 'Classes/Arc'
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']
4.4 frameworks (multi-platform)
用户的target需求链接的体系framework列表。
spec.ios.framework = 'CFNetwork'
spec.frameworks = 'QuartzCore', 'CoreData'
4.5 weak_frameworks (multi-platform)
用户的方针需求弱链接
的结构列表。
spec.weak_framework = 'Twitter'
spec.weak_frameworks = 'Twitter', 'SafariServices'
4.6 libraries (multi-platform)
用户的方针(运用程序)需求链接的体系库的列表。
spec.ios.library = 'xml2'
spec.libraries = 'xml2', 'z'
4.7 compiler_flags (multi-platform)
应该传递给编译器的标志列表。
spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
4.8 pod_target_xcconfig (multi-platform)
要增加到最终私有pod target 的 xcconfig文件中的任何标志。
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
4.9 user_target_xcconfig (multi-platform)
指定要增加到最终聚合target(项目工程target)的xcconfig文件的标志。
不主张运用此特点,由于Pods不该该污染用户项目的构建设置,这或许会导致抵触。主张运用
pod_target_xcconfig
。
spec.user_target_xcconfig = { 'MY_SUBSPEC' => 'YES' }
4.10 prefix_header_contents (multi-platform)
要注入到pod项目前缀头中的任何内容。
不主张运用此特点,由于Pods不该该污染其他库或用户项目的前缀头。
spec.prefix_header_contents = '#import <UIKit/UIKit.h>'
spec.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
4.11 prefix_header_file (multi-platform)
要注入到pod项目的前缀头文件中的前缀头文件的途径。
不主张运用文件途径选项,由于Pods不该该污染其他库或用户项目的前缀头。
spec.prefix_header_file = 'iphone/include/prefix.pch'
spec.prefix_header_file = false
4.12 module_name
该标准生成的用于framework / clang module 的称号,而不是默许称号(假如设置header_dir,否则为标准称号)。
spec.module_name = 'Three20'
4.13 header_dir (multi-platform)
寄存头文件的目录,这样它们就不会破坏include。
spec.header_dir = 'Three20Core'
4.14 header_dir (multi-platform)
保存头文件的文件夹结构的目录。假如没有供给,头文件将被flattened。
spec.header_dir = 'Three20Core'
4.15 script_phases (multi-platform)
此特点答应界说脚本阶段,以作为Pod编译的一部分履行。与prepare command
不同,脚本阶段作为xcodebuild的一部分履行
,它们还能够运用编译期间设置的一切环境变量
。
Pod能够供给多个脚本阶段来履行,它们将依照声明的次序增加。
留意:为了供给一切脚本阶段的内容的可见性,假如pod包括任何脚本,装置时将向用户显现一个正告。
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' },
]
5. File patterns(文件形式)
5.1 File patterns
Podspecs
应该位于库文件夹的根目录
,而且文件的途径也应该相关于存储库的目录指定。文件形式不支撑遍历父目录(…). 文件形式或许包括以下通配符形式:
5.1.1 Pattern:
匹配任何文件,能够被glob中的其他值限制:
*
匹配一切文件
c*
匹配以c最初的文件
*c
匹配以c结束的文件
*c*
匹配包括c的文件
5.1.2 Pattern:
目录递归地匹配。
5.1.3 Pattern:
匹配恣意一个字符。相当于 正则表达式中的/.{1}/
。
5.1.4 Pattern: [set]
匹配调集中的恣意一个字符。
行为与正则表达式中的字符集彻底一样,包括反集([^a-z]
)。
5.1.4 Pattern: {p,q}
匹配字面值p或字面值q。等价于正则表达式中的形式变换。
5.1.5 Pattern:
转义下一个元字符。
示例:
"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"]
5.2 source_files (multi-platform)
pod库中包括的源文件。
spec.source_files = 'Classes/**/*.{h,m}'
spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
5.3 public_header_files (multi-platform)
作为公共头的文件形式列表。
这些文件形式将与源文件进行匹配,以包括将向主项目公开的头文件,并从中生成文档。当构建库时,这些头文件将出现在构建目录中。假如没有指定公共头文件,那么source_files中的一切头文件都被以为是公共的。
spec.public_header_files = 'Headers/Public/*.h'
5.4 project_header_files (multi-platform)
作为项目头的文件形式列表。
这些文件形式将与public headers
进行匹配,以排除那些不该公开给用户项目和不运用于生成文档的headers
。当构建库时,这些头文件将不会出现在构建目录中。
spec.project_header_files = 'Headers/Project/*.h'
5.5 private_header_files (multi-platform)
作为私有头的文件形式列表。
这些形式将与public headers
进行匹配,以排除那些不该公开给用户项目和不运用于生成文档的标头。当构建库时,这些头文件将出现在构建目录中。
未被列为公共、项目或私有文件的头文件会出现在构建目录中。
spec.private_header_files = 'Headers/Private/*.h'
5.6 vendored_frameworks (multi-platform)
Pod所依靠的的framework的途径,一起支撑.framework和.xcframework包。这些结构将供给给Pod和Pod的消费者。
spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework'
spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.xcframework'
5.7 vendored_libraries (multi-platform)
Pod所依靠的库(.a文件)的途径。
spec.ios.vendored_library = 'Libraries/libProj4.a'
spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
5.8 on_demand_resources (multi-platform)
应复制到方针target中的随需应变资源的哈希值。这儿指定的资源将自动成为集成此pod的target的资源构建阶段的一部分。
由pods指定的tag是由CocoaPods办理的。假如一个标签被重命名、更改或删去,那么CocoaPods也会在工程target中进行更新。
s.on_demand_resources = {
'Tag1' => 'file1.png'
}
s.on_demand_resources = {
'Tag1' => ['file1.png', 'file2.png']
}
s.on_demand_resources = {
'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :download_on_demand }
}
s.on_demand_resources = {
'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :initial_install }
}
5.9 resource_bundles (multi-platform)
这个特点答应为pod构建运用的资源包界说name。便是一个键值对,其中key表明包的称号,value表明它们应该包括的文件形式的值。
为了将Pod构建为一个静态库,推荐选用
resource_bundles
,由于运用resources
特点或许会发生称号抵触。
包的称号至少应该包括Pod的称号,以尽量减少称号抵触的时机。
spec.ios.resource_bundle = { 'MapBox' => 'MapView/Map/Resources/*.png' }
spec.resource_bundles = {
'MapBox' => ['MapView/Map/Resources/*.png'],
'MapBoxOtherResources' => ['MapView/Map/OtherResources/*.png']
}
5.10 resources (multi-platform)
应该复制到方针target bundle
中的资源列表。
为了将Pod构建为一个静态库,强烈主张选用resource_bundles
,由于运用resources
特点或许会发生称号抵触
。此外,用这个特点指定的资源会直接复制到客户端方针中,因而它们不会被Xcode优化。
spec.resource = 'Resources/HockeySDK.bundle'
spec.resources = ['Images/*.png', 'Sounds/*']
5.11 exclude_files (multi-platform)
应该从其他文件形式中排除的文件形式列表。
spec.ios.exclude_files = 'Classes/osx'
spec.exclude_files = 'Classes/**/unused.{h,m}'
5.12 preserve_paths (multi-platform)
下载后不该删去的任何文件。
默许情况下,CocoaPods删去一切与任何其他文件形式不匹配的文件。
spec.preserve_path = 'IMPORTANT.txt'
spec.preserve_paths = 'Frameworks/*.framework'
5.13 module_map (multi-platform)
当此pod集成为framework时应该运用的模块映射文件。
false表明不该该生成默许的CocoaPods modulemap文件。
true为默许值,表明应该生成默许的CocoaPods modulemap文件。
默许情况下,CocoaPods依据标准中的公共头文件创立模块映射文件。
spec.module_map = 'source/module.modulemap'
spec.module_map = false
```。