Podspec語法

前言

​ 長時間不寫Podspec文件,容易忘記裏面的一些屬性含義,因此本文把 官方Podspec語法v1.9.0 翻譯出來而且加上了一部分本身的理解,方便後續在用到的時候能夠直接拿過來看。html

CocoaPods版本升級後會保持對本文進行更新。ios

1、Root specification相關

root規範存儲了相關庫特定版本的信息。git

下面的屬性只能寫在root規範上,而不能寫在「sub-spec」上。github

一、必須的字段

. name

spec.name = 'AFNetworking'

pod search 搜索的關鍵詞,這裏必定要和.podspec的名稱同樣,不然會報錯;shell

. version

spec.version = '0.0.1'

Pod最新的版本。swift

. authors

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

庫維護者(而不是Podspec維護者)的名稱和電子郵件地址。xcode

. 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的許可證ruby

除非源中包含一個名爲LICENSE.*LICENCE.*的文件,不然必須指定許可證文件的路徑一般用於許可證類型的通知的完整文本。若是指定了許可文件,它要麼必須是沒有文件擴展名或者是一個txtmdmarkdownbash

. homepage

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

Pod主頁的URLmarkdown

. source

檢索庫的位置

一、使用標籤指定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

. summary

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

簡短說明(最多140個字符),該摘要應適當大寫幷包含正確的標點符號。

二、選填字段

. 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名稱。

2、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的多個平臺-爲每一個平臺指定不一樣的部署目標。

3、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包含任何腳本,則會在安裝時向用戶顯示警告。

4、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基於規範中的公共頭建立模塊映射文件。

5、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

指定默認的依賴,若是不指定就依賴所有子依賴。

6、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 進行驗證。

相關文章
相關標籤/搜索