关于ios:Podspec语法

72次阅读

共计 8923 个字符,预计需要花费 23 分钟才能阅读完成。

前言

​ 长时间不写 Podspec 文件,容易遗记外面的一些属性含意,所以本文把 官网 Podspec 语法 v1.9.0 翻译进去并且加上了一部分本人的了解,不便后续在用到的时候能够间接拿过去看。

CocoaPods 版本升级后会放弃对本文进行更新。

一、Root specification 相干

root 标准存储了相干库特定版本的信息。

上面的属性只能写在 root 标准上,而不能写 在“sub-spec”上。

1、必须的字段

. name

spec.name = 'AFNetworking'

pod search 搜寻的关键词,这里肯定要和.podspec 的名称一样,否则会报错;

. version

spec.version = '0.0.1'

Pod 最新的版本。

. authors

spec.author = 'Darth Vader'
spec.authors = 'Darth Vader', 'Wookiee'
spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
                 'Wookiee'     => 'wookiee@aggrrttaaggrrt.com' }

库维护者(而不是 Podspec 维护者)的名称和电子邮件地址。

. license

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 的许可证

除非源中蕴含一个名为 LICENSE.*LICENCE.*的文件,否则 必须指定许可证文件的门路 通常用于许可证类型的告诉的残缺文本。如果指定了许可文件,它要么必须是没有文件扩展名或者是一个 txtmdmarkdown

. homepage

spec.homepage = 'http://www.example.com'

Pod 主页的 URL

. source

检索库的地位

1、应用标签指定 Git 起源。少数 Podspecs 是这样写的。

spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
                :tag => spec.version.to_s }

2、应用以 ’v’ 和子模块为前缀的标签。

spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git',
                :tag => "v#{spec.version}", :submodules => true }

3、应用带标记的 Subversion。

spec.source = {:svn => 'http://svn.code.sf.net/p/polyclipping/code', :tag => '4.8.8'}

4、应用与标准的语义版本字符串雷同版本的 Mercurial。

spec.source = {:hg => 'https://bitbucket.org/dcutting/hyperbek', :revision => "#{s.version}" }

5、应用 HTTP 下载代码的压缩文件。它反对 zip,tgz,bz2,txz 和 tar。

spec.source = {:http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip'}

6、应用 HTTP 下载文件,并应用哈希来验证下载。它反对 sha1 和 sha256。

spec.source = { :http => 'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip',
                :sha1 => '7e21857fe11a511f472cfd7cfa2d979bd7ab7d96' }

咱们个别比拟罕用的就是形式 1 了,也有 2 和 3

. summary

spec.summary = 'Computes the meaning of life.'

简短阐明(最多 140 个字符),该摘要应适当大写并蕴含正确的标点符号。

2、选填字段

. swift_versions

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 编译器可能不会齐全认可它。

咱们个别是间接指定版本

. cocoapods_version

spec.cocoapods_version = '>= 0.36'

所反对的 CocoaPods 版本,比方某个属性,是某个 cocoapods 版本以上才有的,这个时候进行依赖装置,就须要指定版本。

. social_media_url

spec.social_media_url = 'https://twitter.com/cocoapods'
spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'

Pod、CocoaPods Web 服务的社交媒体联系人的 URL 能够应用此 URL。

. description

spec.description = <<-DESC
                     Computes the meaning of life.
                     Features:
                     1. Is self aware
                     ...
                     42. Likes candies.
                   DESC

比摘要更具体的阐明,用这个字段

. screenshots

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 格局。

. documentation_url

spec.documentation_url = 'http://www.example.com/docs.html'

Pod 文档的可选 URL,CocoaPods 网络媒体资源将应用该 URL。将其保留为空白将默认为您的库 CocoaDocs 生成 URL。

. prepare_command

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 选件,则不会执行此命令。

. static_framework

spec.static_framework = true

use_frameworks!如果指定,则 pod 该当蕴含动态库框架。

. deprecated

spec.deprecated = true

是否已废除该库。

. deprecated_in_favor_of

spec.deprecated_in_favor_of = 'NewMoreAwesomePod'

不反对应用的 Pod 名称。

二、Platform 相干

次要是指明反对以后库的平台和相应的部署 target。

. Platform

spec.platform = :osx, '10.8'
spec.platform = :ios
spec.platform = :osx

反对此 Pod 的平台。保留此空白示意 Pod 在所有平台上都反对。当反对多个平台时,应改为应用以下 deployment_target。

. deployment_target

spec.ios.deployment_target = '6.0'
spec.osx.deployment_target = '10.8'

反对平台的最低部署 target。

platform 属性相同,deployment_target 属性容许指定反对该 Pod 的多个平台 - 为每个平台指定不同的部署指标。

三、Build settings 相干

构建环境的配置相干设置

. dependency

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”的依赖。依赖关系能够指定版本要求。

. info_plist

spec.info_plist = {
  'CFBundleIdentifier' => 'com.myorg.MyLib',
  'MY_VAR' => 'SOME_VALUE'
}

要增加到生成的键值对Info.plist

这些值将与 CocoaPods 生成的默认值合并,从而笼罩所有反复项。

对于库标准,值将合并到为应用框架集成的库生成的 Info.plist 中。它对动态库有效。

不反对 sub-spec(利用和测试 spec 除外)。

对于应用程序标准,这些值将合并到应用程序主机的中Info.plist

对于测试 spec,这些值将合并到测试包的中Info.plist

. requires_arc

# 默认
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

. frameworks

spec.ios.framework = 'CFNetwork'
spec.frameworks = 'QuartzCore', 'CoreData'

以后 target 所需零碎 framework 列表

. weak_frameworks

spec.weak_framework = 'Twitter'
spec.weak_frameworks = 'Twitter', 'SafariServices'

以后 target 所需“弱援用”的 framework 列表

. libraries

spec.ios.library = 'xml2'
spec.libraries = 'xml2', 'z'

以后 target 所需零碎 library 列表

. compiler_flags

spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'

传递给编译器的 flag

. pod_target_xcconfig

spec.pod_target_xcconfig = {'OTHER_LDFLAGS' => '-lObjC'}

要增加到最终 公有 pod 指标 xcconfig 文件的任何标记。

. user_target_xcconfig

不举荐应用

. prefix_header_contents

不举荐应用

. prefix_header_file

不举荐应用

. module_name

spec.module_name = 'Three20'

用于该 spec 的框架 / clang 模块的名称,而不是默认的名称(如果设置,则为 header_dir,否则为标准名称)。

. header_dir

spec.header_dir = 'Three20Core'

头文件的存储目录。

. header_mappings_dir

spec.header_mappings_dir = 'src/include'

用于保留头文件的文件夹构造的目录。如果未提供,则将头文件展平。

. script_phases

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 蕴含任何脚本,则会在装置时向用户显示正告。

四、File patterns 相干

文件门路相干设置;不反对遍历父目录

  • * 匹配所有文件
  • c* 匹配所有以 c 结尾的文件
  • *c 匹配所有以 c 结尾的文件
  • *c* 将匹配其中蕴含 c 的所有文件(包含结尾或结尾)

. source_files

spec.source_files = 'Classes/**/*.{h,m}'
spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'

须要蕴含的源文件

. public_header_files

spec.public_header_files = 'Headers/Public/*.h'

用作公共头的文件模式列表。

这些模式与源文件匹配,以蕴含将公开给用户我的项目并从中生成文档的标头。构建库时,这些头将呈现在构建目录中。如果未指定公共头,则将 source_files 中的 所有 头视为公共。

. private_header_files

spec.private_header_files = 'Headers/Private/*.h'

用来标记公有文件模式列表。

这些模式与公共标头(如果未指定公共标头,则与所有标头)匹配,以排除那些不应裸露给用户我的项目并且不利用于生成文档的标头。构建库时,这些头将呈现在构建目录中。

没有列出为公共和公有的头文件将被视为公有,但除此之外基本不会呈现在构建目录中。

. vendored_frameworks

spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework'
spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.framework'

源文件相关联的 framework

. vendored_libraries

spec.ios.vendored_library = 'Libraries/libProj4.a'
spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'

源文件相关联的 libraries

. resource_bundles

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 的名称,以最大水平地缩小名称抵触的可能性。

. resources

spec.resource = 'Resources/HockeySDK.bundle'
spec.resources = ['Images/*.png', 'Sounds/*']

复制到 target 中的资源列表。

为了将 Pod 构建为动态库,官网倡议是应用 resource_bundle,因为应用 resources 属性可能会产生名称抵触。此外,应用此属性指定的资源将间接复制到客户端指标,因而 Xcode 不会对其进行优化。

. exclude_files

spec.ios.exclude_files = 'Classes/osx'
spec.exclude_files = 'Classes/**/unused.{h,m}'

从其余文件模式中排除的文件模式列表。

比方在设置某个子模块的时候,不须要包含其中的一些文件,就能够通过这个属性来进行设置。

. preserve_paths

spec.preserve_path = 'IMPORTANT.txt'
spec.preserve_paths = 'Frameworks/*.framework'

任何被下载的文件之后是不会被移除。

默认状况下,CocoaPods 会移除所有与其余任何文件模式都不匹配的文件。

. module_map

spec.module_map = 'source/module.modulemap'

将此 Pod 集成为框架时应应用的模块映射文件。

默认状况下,CocoaPods 基于标准中的公共头创立模块映射文件。

五、Subspecs 相干

一个库能够指定依赖在另一个库、另一个库的子标准或本身的子标准上。

具体看上面这个例子:

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 依赖是能够指定具体依赖哪一个模块。

. default_subspecs

spec.default_subspec = 'Core'
spec.default_subspecs = 'Core', 'UI'
spec.default_subspecs = :none

指定默认的依赖,如果不指定就依赖全副子依赖。

六、Multi-Platform support

设置反对的某个平台,比方 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 进行验证。

正文完
 0