相关文章推荐
含蓄的火柴  ·  创建 TLS 客户端 ...·  9 月前    · 
温柔的烤红薯  ·  java - ...·  1 年前    · 

spec 文件描述了 Pod 库的版本。它包括有关从 哪里获取source 、要使用 哪些文件 、应用程序构建设置以及其他通用元数据(如名称、版本和描述)的详细信息。

二、spec文件(Specification) 规范说明

1.创建spec文件

pod spec create DemoSpec
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.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 '

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' }

#使用HTTP下载代码的压缩文件。它支持zip、tgz、bz2、txz和tar。

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官网