Podspec語法

前言

? 長(zhǎng)時(shí)間不寫Podspec文件,容易忘記里面的一些屬性含義,所以本文把 官方Podspec語法v1.9.0 翻譯出來并且加上了一部分自己的理解读跷,方便后續(xù)在用到的時(shí)候可以直接拿過來看燃领。

CocoaPods版本升級(jí)后會(huì)保持對(duì)本文進(jìn)行更新聘惦。

一丸逸、Root specification相關(guān)

root規(guī)范存儲(chǔ)了相關(guān)庫特定版本的信息蹋艺。

下面的屬性只能寫在root規(guī)范上剃袍,而不能寫在“sub-spec”上黄刚。

1、必須的字段

. name

spec.name = 'AFNetworking'

pod search 搜索的關(guān)鍵詞民效,這里一定要和.podspec的名稱一樣憔维,否則會(huì)報(bào)錯(cuò);

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

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

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

除非源中包含一個(gè)名為LICENSE.*LICENCE.*的文件,否則必須指定許可證文件的路徑通常用于許可證類型的通知的完整文本舒萎。如果指定了許可文件程储,它要么必須是沒有文件擴(kuò)展名或者是一個(gè)txtmdmarkdown臂寝。

. homepage

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

Pod主頁的URL

. source

檢索庫的位置

1章鲤、使用標(biāo)簽指定Git來源。多數(shù)Podspecs是這樣寫的咆贬。

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

2败徊、使用以'v'和子模塊為前綴的標(biāo)簽。

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

3掏缎、使用帶標(biāo)記的Subversion皱蹦。

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

4、使用與規(guī)范的語義版本字符串相同版本的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下載文件,并使用哈希來驗(yàn)證下載呆躲。它支持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.'

簡(jiǎn)短說明(最多140個(gè)字符)插掂,該摘要應(yīng)適當(dāng)大寫并包含正確的標(biāo)點(diǎn)符號(hào)灰瞻。

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編譯器主要接受主要版本,有時(shí)會(huì)接受次要版本要销。盡管CocoaPods允許指定次要版本或補(bǔ)丁版本构回,但Swift編譯器可能不會(huì)完全認(rèn)可它。

我們一般是直接指定版本

. cocoapods_version

spec.cocoapods_version = '>= 0.36'

所支持的CocoaPods版本疏咐,比如某個(gè)屬性纤掸,是某個(gè)cocoapods版本以上才有的,這個(gè)時(shí)候進(jìn)行依賴安裝浑塞,就需要指定版本借跪。

. 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服務(wù)的社交媒體聯(lián)系人的URL可以使用此URL酌壕。

. description

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

比摘要更詳細(xì)的說明掏愁,用這個(gè)字段

. 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圖片的網(wǎng)址列表。用于面向UI庫卵牍。CocoaPods建議使用gif格式果港。

. documentation_url

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

Pod文檔的可選URL,CocoaPods網(wǎng)絡(luò)媒體資源將使用該URL辽慕。將其保留為空白將默認(rèn)為您的庫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后將執(zhí)行的bash腳本。該命令可用于創(chuàng)建溅蛉,刪除和修改下載的任何文件公浪,并且將在收集規(guī)范其他文件屬性的任何路徑之前運(yùn)行。

在清理Pod和創(chuàng)建Pods項(xiàng)目之前船侧,將執(zhí)行此命令欠气。工作目錄是Pod的根目錄。

如果pod安裝了該:path選件镜撩,則不會(huì)執(zhí)行此命令预柒。

. static_framework

spec.static_framework = true

use_frameworks!如果指定袁梗,則pod應(yīng)當(dāng)包含靜態(tài)庫框架宜鸯。

. deprecated

spec.deprecated = true

是否已廢棄該庫。

. deprecated_in_favor_of

spec.deprecated_in_favor_of = 'NewMoreAwesomePod'

不支持使用的Pod名稱遮怜。

二淋袖、Platform相關(guān)

主要是指明支持當(dāng)前庫的平臺(tái)和相應(yīng)的部署target。

. Platform

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

支持此Pod的平臺(tái)锯梁。保留此空白表示Pod在所有平臺(tái)上都支持即碗。當(dāng)支持多個(gè)平臺(tái)時(shí)焰情,應(yīng)改為使用以下deployment_target。

. deployment_target

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

支持平臺(tái)的最低部署target剥懒。

platform屬性相反内舟,deployment_target 屬性允許指定支持該P(yáng)od的多個(gè)平臺(tái)-為每個(gè)平臺(tái)指定不同的部署目標(biāo)。

三初橘、Build settings相關(guān)

構(gòu)建環(huán)境的配置相關(guān)設(shè)置

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

對(duì)其他Pod或“sub-spec”的依賴验游。依賴關(guān)系可以指定版本要求。

. info_plist

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

要添加到生成的鍵值對(duì)Info.plist壁却。

這些值將與CocoaPods生成的默認(rèn)值合并批狱,從而覆蓋所有重復(fù)項(xiàng)裸准。

對(duì)于庫規(guī)范展东,值將合并到為使用框架集成的庫生成的Info.plist中。它對(duì)靜態(tài)庫無效炒俱。

不支持sub-spec(應(yīng)用和測(cè)試spec除外)盐肃。

對(duì)于應(yīng)用程序規(guī)范,這些值將合并到應(yīng)用程序主機(jī)的中Info.plist权悟。

對(duì)于測(cè)試spec砸王,這些值將合并到測(cè)試包的中Info.plist

. requires_arc

# 默認(rèn)
spec.requires_arc = true 
# 設(shè)置
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編譯器標(biāo)志驹闰。

此屬性的默認(rèn)值為true

. frameworks

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

當(dāng)前target所需系統(tǒng)framework列表

. weak_frameworks

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

當(dāng)前target所需“弱引用”的framework列表

. libraries

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

當(dāng)前target所需系統(tǒng)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目標(biāo)xcconfig文件的任何標(biāo)志撒会。

. user_target_xcconfig

不推薦使用

. prefix_header_contents

不推薦使用

. prefix_header_file

不推薦使用

. module_name

spec.module_name = 'Three20'

用于該spec的框架/ clang模塊的名稱嘹朗,而不是默認(rèn)的名稱(如果設(shè)置,則為header_dir诵肛,否則為規(guī)范名稱)屹培。

. header_dir

spec.header_dir = 'Three20Core'

頭文件的存儲(chǔ)目錄。

. header_mappings_dir

spec.header_mappings_dir = 'src/include'

用于保留頭文件的文件夾結(jié)構(gòu)的目錄怔檩。如果未提供褪秀,則將頭文件展平。

. 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編譯的一部分執(zhí)行媒吗。與prepare命令不同,腳本作為xcodebuild的一部分執(zhí)行许蓖,也可以利用在編譯期間設(shè)置的所有環(huán)境變量蝴猪。

Pod可以提供要執(zhí)行的多個(gè)腳本调衰,并且將按照聲明的順序添加它們,并考慮它們的執(zhí)行位置設(shè)置自阱。

注意 為了提供對(duì)所有腳本內(nèi)容的可見性和意識(shí)嚎莉,如果安裝了Pod包含任何腳本,則會(huì)在安裝時(shí)向用戶顯示警告沛豌。

四趋箩、File patterns相關(guān)

文件路徑相關(guān)設(shè)置;不支持遍歷父目錄

  • * 匹配所有文件
  • c* 匹配所有以c開頭的文件
  • *c 匹配所有以c結(jié)尾的文件
  • *c* 將匹配其中包含c的所有文件(包括開頭或結(jié)尾)

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

用作公共頭的文件模式列表加派。

這些模式與源文件匹配叫确,以包含將公開給用戶項(xiàng)目并從中生成文檔的標(biāo)頭。構(gòu)建庫時(shí)芍锦,這些頭將出現(xiàn)在構(gòu)建目錄中竹勉。如果未指定公共頭,則將source_files中的所有頭視為公共娄琉。

. private_header_files

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

用來標(biāo)記私有文件模式列表次乓。

這些模式與公共標(biāo)頭(如果未指定公共標(biāo)頭,則與所有標(biāo)頭)匹配孽水,以排除那些不應(yīng)暴露給用戶項(xiàng)目并且不應(yīng)用于生成文檔的標(biāo)頭票腰。構(gòu)建庫時(shí),這些頭將出現(xiàn)在構(gòu)建目錄中女气。

沒有列出為公共和私有的頭文件將被視為私有杏慰,但除此之外根本不會(huì)出現(xiàn)在構(gòu)建目錄中。

. vendored_frameworks

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

源文件相關(guān)聯(lián)的framework

. vendored_libraries

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

源文件相關(guān)聯(lián)的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構(gòu)建為靜態(tài)庫炼鞠,官方強(qiáng)烈建議使用此屬性來管理資源文件缘滥,因?yàn)槭褂胷esources屬性可能會(huì)發(fā)生名稱沖突。

資源文件bundle的名稱至少應(yīng)包括Pod的名稱簇搅,以最大程度地減少名稱沖突的可能性完域。

. resources

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

復(fù)制到target中的資源列表。

為了將Pod構(gòu)建為靜態(tài)庫瘩将,官方建議是使用resource_bundle吟税,因?yàn)槭褂胷esources屬性可能會(huì)發(fā)生名稱沖突。此外姿现,使用此屬性指定的資源將直接復(fù)制到客戶端目標(biāo)肠仪,因此Xcode不會(huì)對(duì)其進(jìn)行優(yōu)化。

. exclude_files

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

從其他文件模式中排除的文件模式列表备典。

比如在設(shè)置某個(gè)子模塊的時(shí)候异旧,不需要包括其中的一些文件,就可以通過這個(gè)屬性來進(jìn)行設(shè)置提佣。

. preserve_paths

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

任何被下載的文件之后是不會(huì)被移除吮蛹。

默認(rèn)情況下荤崇,CocoaPods會(huì)移除所有與其他任何文件模式都不匹配的文件。

. module_map

spec.module_map = 'source/module.modulemap'

將此Pod集成為框架時(shí)應(yīng)使用的模塊映射文件潮针。

默認(rèn)情況下术荤,CocoaPods基于規(guī)范中的公共頭創(chuàng)建模塊映射文件。

五每篷、Subspecs相關(guān)

一個(gè)庫可以指定依賴在另一個(gè)庫瓣戚、另一個(gè)庫的子規(guī)范或自身的子規(guī)范上。

具體看下面這個(gè)例子:

pod 'ShareKit', '2.0'
pod 'ShareKit/Twitter',  '2.0'
pod 'ShareKit/Pinboard', '2.0'

我們有時(shí)候會(huì)編寫這樣的podfile文件焦读,導(dǎo)入第三方或者自己依賴的庫子库;那么它對(duì)應(yīng)的podspec文件應(yīng)該如何編寫呢?

如下:

subspec 'Twitter' do |sp|
  sp.source_files = 'Classes/Twitter'
end

subspec 'Pinboard' do |sp|
  sp.source_files = 'Classes/Pinboard'
end

這樣寫就可以了矗晃,指定對(duì)應(yīng)的源關(guān)聯(lián)文件或者資源文件即可仑嗅。

注意一點(diǎn),就是通過pod search的時(shí)候只能是整個(gè)模塊喧兄,即你不能單獨(dú)搜索里面的子模塊无畔,但是我們podfile依賴是可以指定具體依賴哪一個(gè)模塊。

. default_subspecs

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

指定默認(rèn)的依賴吠冤,如果不指定就依賴全部子依賴。

六恭理、Multi-Platform support

設(shè)置支持的某個(gè)平臺(tái)拯辙,比如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 進(jìn)行驗(yàn)證。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末周伦,一起剝皮案震驚了整個(gè)濱河市夕春,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌专挪,老刑警劉巖及志,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寨腔,居然都是意外死亡速侈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門迫卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倚搬,“玉大人,你說我怎么就攤上這事乾蛤∶拷纾” “怎么了捅僵?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)眨层。 經(jīng)常有香客問我命咐,道長(zhǎng),這世上最難降的妖魔是什么谐岁? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任醋奠,我火速辦了婚禮,結(jié)果婚禮上伊佃,老公的妹妹穿的比我還像新娘窜司。我一直安慰自己,他們只是感情好航揉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布塞祈。 她就那樣靜靜地躺著,像睡著了一般帅涂。 火紅的嫁衣襯著肌膚如雪议薪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天媳友,我揣著相機(jī)與錄音斯议,去河邊找鬼。 笑死醇锚,一個(gè)胖子當(dāng)著我的面吹牛哼御,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焊唬,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼恋昼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了赶促?” 一聲冷哼從身側(cè)響起佑笋,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤只冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输虱,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尊搬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年扛或,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洲劣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡空幻,死狀恐怖烁峭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤约郁,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布缩挑,位于F島的核電站,受9級(jí)特大地震影響鬓梅,放射性物質(zhì)發(fā)生泄漏供置。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一绽快、第九天 我趴在偏房一處隱蔽的房頂上張望芥丧。 院中可真熱鬧,春花似錦坊罢、人聲如沸续担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽物遇。三九已至,卻和暖如春憾儒,著一層夾襖步出監(jiān)牢的瞬間询兴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工起趾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诗舰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓阳掐,卻偏偏與公主長(zhǎng)得像始衅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缭保,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345