美文网首页React Native
Podspec语法参考 v1.2.0.beta.1

Podspec语法参考 v1.2.0.beta.1

作者: 有毒的程序猿 | 来源:发表于2021-10-26 15:14 被阅读0次

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

    一、Specification 规范说明

    #创建spec文件
    pod spec create DemoSpec
    
    

    1、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.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'
    end
    
    

    二、语法

    1、Root specification 根规范

    “根”规范存储有关库的特定版本的信息。此组中的属性只能写入“根”规范,而不是“子规范”。在这个组中列出的属性是podspec需要的唯一属性。其他组的属性被用来改进podspec并遵循一个关于配置方法的约定。根规范可以直接通过“sub-specifications”来描述这些属性。

    • name 必须
    #跟podspec文件名相同
    spec.name = 'AFNetworking'
    
    
    • version 必须
    spec.version = '0.0.1'
    
    
    • cocoapods_version
      规范支持的CocoaPods版本。
    spec.cocoapods_version = '>= 0.36'
    
    
    • authors 必须
      库维护人员的名称和电子邮件地址,不是Podspec维护者。
    spec.author = 'Darth Vader'
    
    
    #多个作者
    spec.authors = 'Darth Vader', 'Wookiee'
    
    
    #多个作者,以及其邮箱
    spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
                     'Wookiee'     => 'wookiee@aggrrttaaggrrt.com' }
    
    
    • license 必须
      pod库的许可证。除非源文件包含一个名为LICENSE.* or LICENCE.*的文件,否则许可证文件的路径或通常用于许可证类型的公告完整文本,必须指定。许可证文件可以没有文件扩展名也可以是txt, md, 或是markdown,
    #许可证默认与spec文件在同一目录下
    #MIT是一个比较宽泛的开源许可协议
    spec.license = 'MIT'
    
    
    #指定许可文件
    spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' }
    
    
    #指定了许可证文件的内容
    spec.license = { :type => 'MIT', :text => <<-LICENSE
                       Copyright 2012
                       Permission is granted to...
                     LICENSE
                   }
    
    
    • homepage 必须
      pod库主页地址
    spec.homepage = 'http://www.example.com'
    
    
    • source 必须
      pod库的位置
    #通过tag指定Git源 用的最多的方式!!
    #tag值与spec.version一致。
    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

    • summary 必须
      pod库简介,最多140个字符。
    spec.summary = 'Computes the meaning of life.'
    
    
    • description
      pod库的描述,比summary详细
    spec.description = <<-DESC
                         Computes the meaning of life.
                         Features:
                         1. Is self aware
                         ...
                         42. Likes candies.
                       DESC
    
    
    • screenshots
      用图片展示pod库,UI库可以使用这种方式,其他的建议使用git地址
    # 单个截图
    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' ]
    
    
    • documentation_url
      可选的Pod库文档的URL。
    spec.documentation_url = 'http://www.example.com/docs.html'
    
    
    • 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
                       CMD
    
    
    • deprecated
      是否弃用
    spec.deprecated = true
    
    
    • deprecated_in_favor_of
      设置弃用的pod库的新名字,告诉使用者可以搜索新的库名。
    spec.deprecated_in_favor_of = 'NewMoreAwesomePod'
    
    

    2、Platform

    规范应该指出使用pod支持的平台和相应的部署目标。
    如果没有在子规范中定义,该分组的属性将继承父类的值。

    • platform
      不设置表示支持全部平台,如果支持多个平台使用deployment_target命令
    #只能在OS系统使用,要求系统版本至少10.8
    spec.platform = :osx, '10.8'
    
    
    #也可以只指定平台,不指定版本
    spec.platform = :iOS
    
    
    • deployment_target
      平台支持的最低部署版本,可以分别为每个平台指定不同的版本。
    spec.ios.deployment_target = '6.0'
    
    
    spec.osx.deployment_target = '10.8'
    
    

    3、Build settings

    接下来列出了与构建库所用的构建环境相关的属性。

    • dependency
      设置对其他pod或“sub-specification”的依赖。
      依赖关系如果需要指定版本,推荐使用~>
    spec.dependency 'AFNetworking', '~> 1.0'
    
    
    #依赖RestKit库中的子模块
    spec.dependency 'RestKit/CoreData', '~> 0.20.0'
    
    
    #指定某个平台的依赖
    spec.ios.dependency 'MBProgressHUD', '~> 0.5'
    
    
    • requires_arc 支持多平台
      requires_arc允许指定哪个source_files使用ARC。不使用ARC的文件将添加- fno-objc- ARC编译器标记。
      此属性的默认值为true。
    #不支持ARC
    spec.requires_arc = false
    
    
    #指定某个文件夹支持ARC的
    spec.requires_arc = 'Classes/Arc'
    
    
    #指定某些文件支持ARC
    spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']
    
    
    • frameworks 支持多平台
      需要链接的系统frameworks
    spec.ios.framework = 'CFNetwork'
    
    
    #多个库
    spec.frameworks = 'QuartzCore', 'CoreData'
    
    
    • libraries 支持多平台
    spec.ios.library = 'xml2'
    
    
    #多个库,其中xml2对应ibxml2.tbd       z对应libz.tbd
    #所以lib库 省略lib与后缀。
    spec.libraries = 'xml2', 'z'
    
    
    • compiler_flags 支持多平台
      编译参数
    #-D是前缀,-Wno-format这个是gcc编译警告的参数
    spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
    
    
    • pod_target_xcconfig 支持多平台
      设置的参数都会添加到最终的私有pod的target xcconfig文件中
      【注意】这是设置pod库的target 命令
    #OTHER_LDFLAGS  对应buildsetting的other linker flags
    spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
    
    
    • user_target_xcconfig 支持多平台
      这个会添加到最终target 的xcconfig中,不建议使用,不应该污染用户项目的构建设置,因为这可能导致冲突。
      如果导入pod时,需要使用clang编译器标志或预编译器宏定义,最好使用pod_target_xcconfig,这个只会影响你自己的pod target。
    spec.user_target_xcconfig = { 'MY_SUBSPEC' => 'YES' }
    
    
    image
    • prefix_header_contents 支持多平台
      在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
    EOS
    
    
    s.prefix_header_contents = <<-EOS
    #define HHHH @"测试代码"
    EOS
    
    
    image image
    • prefix_header_file 支持多平台
      指定pch文件
    spec.prefix_header_file = 'iphone/include/prefix.pch'
    
    
    • module_name
      模块对外的名称,如果设置了,主工程链接的时候用的是指定的名称。
    spec.module_name = 'Three20'
    
    

    4、File patterns 文件格式

    Podspecs应该放在pod库的根目录,文件模式不支持遍历父目录(. .),要相对于pod库的根来指定文件的路径。

    • source_files
      pod库的源文件
    #包含Classes目录下的所有.h .m文件
    spec.source_files = 'Classes/**/*.{h,m}'
    
    
    #包含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"]
    
    
    • public_header_files
      pod库暴露给用户工程的头文件。如果不指定那么source_files中的所有header都被认为是公共的。
    spec.public_header_files = 'Headers/Public/*.h'
    
    
    • private_header_files
      设置私有头文件
    spec.private_header_files = 'Headers/Private/*.h'
    
    
    • vendored_frameworks
      pod库中framework的路径
    spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework'
    
    
    spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.framework'
    
    
    • vendored_libraries
      pod库中的静态库
    spec.ios.vendored_library = 'Libraries/libProj4.a'
    
    
    spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
    
    
    • 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']
      }
    
    
    • resources
      使用此属性指定的资源直接复制到客户端目标,因此不会被Xcode优化,推荐使用resource_bundles
    spec.resource = 'Resources/HockeySDK.bundle'
    
    
    #多个,注意是resources复数形式,也可以不加[ ]
    spec.resources = ['Images/*.png', 'Sounds/*']
    
    
    • exclude_files
      排除在外的文件,与source_files相对
    spec.ios.exclude_files = 'Classes/osx'
    
    
    spec.exclude_files = 'Classes/**/unused.{h,m}'
    
    
    • preserve_paths
      下载后不会被删除的文件。默认删除不匹配任何file pattern的文件。
    spec.preserve_path = 'IMPORTANT.txt'
    
    
    spec.preserve_paths = 'Frameworks/*.framework'
    
    
    • module_map
      pod被组装成framework的时候module map文件可能用的上,默认的cocoapod会基于public headers 创建一个module map。
    spec.module_map = 'source/module.modulemap'
    
    

    5、Subspecs

    可以理解为pod库中的子模块。
    一个库可以指定对另一个库的依赖,另一个库的子规范,或者是它自身的子规范。

    • subspec
      用来表示pod库模块的规范
      一方面,spec自动将subspecs作为依赖项(除非指定了默认的子规范)。
      另一方面,“子规范”继承了父属性的值,因此可以在父类中指定属性的共同值。
    #安装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
    
    
    #子库的spec依赖其他subspec·
    Pod::Spec.new do |s|
      s.name = 'RestKit'
    
      s.subspec 'Core' do |cs|
        cs.dependency 'RestKit/ObjectMapping'
        cs.dependency 'RestKit/Network'
        cs.dependency 'RestKit/CoreData'
      end
    
      s.subspec 'ObjectMapping' do |os|
      end
    end
    
    
    #嵌套的Subspec
    Pod::Spec.new do |s|
      s.name = 'Root'
    
      s.subspec 'Level_1' do |sp|
        sp.subspec 'Level_2' do |ssp|
        end
      end
    end
    
    
    • default_subspecs
      一组用来作为依赖项的subspec名称。如果没有指定则要求其所有的subspec作为依赖项。
      默认情况下pod库应该提供完整的库。用户可以根据需求微调他们的依赖项,排除不需要的子模块(subspec)。
      这个属性很少用。
    spec.default_subspec = 'Core'
    
    
    spec.default_subspecs = 'Core', 'UI'
    
    

    6、Multi-Platform support

    所有标识支持多平台的,都可以针对平台设置参数

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

    相关文章

      网友评论

        本文标题:Podspec语法参考 v1.2.0.beta.1

        本文链接:https://www.haomeiwen.com/subject/oifyaltx.html