從文檔開始了解cocoapods之Podspec

概述

距離上一篇podfile介紹過去已經(jīng)幾個月了询张,很想抽時間將這個系列的文章抓緊補齊孙乖,但是時間一拖再拖,我也不想找什么理由份氧〉脑玻總結(jié)一下就是兩個原因。

  • 1.最近工作比較忙(這其實是一個借口)
  • 2.確實是比較懶??半火。

今天來把這個坑補一下越妈。

這個系列的前兩篇文章,其實都是在翻譯cocoapods官方文檔钮糖,也加入了一些自己的理解梅掠,并且對文檔說明不清的地方做了補充,若有翻譯不清楚的地方或者理解不清的地方店归,大家直接在評論里提出來即可阎抒。我看到了就會修改的。

該系列文章鏈接

那么接下來消痛,我們進入正題且叁,開始Podspec相關(guān)內(nèi)容的探討。

一:Podspec文件介紹

podsepc文件的全稱我們可以叫做 pod specification秩伞,specification是規(guī)格說明書的意思逞带,所以顧名思義,podspec就是pod 庫的規(guī)格說明書(配置文件),這個說明書描述了pod庫的版本纱新,包括了源文件的需要的地址展氓,用什么樣的文件,需要什么樣的構(gòu)建配置脸爱,還有許多普通的元數(shù)據(jù)像是庫的名稱遇汞,版本號以及描述。

podspec可以通過以下創(chuàng)建

pod spec create "庫名"   

spec的DSL(特定領(lǐng)域的計算機語言)提供了非常好的擴展性和動態(tài)性簿废。另外空入,DSL還采用了convention over configuration(簡而言之就是給定一些默認值從而減少程序員對于某些問題的決策數(shù)量)因此可以非常簡單,如下族檬。

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.source_files = 'Reachability.{h,m}'
  spec.framework    = 'SystemConfiguration'
end

或者可以更加復(fù)雜

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.swift_version = '4.0'

  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

二 : 根配置

根配置存儲了特定版本庫的詳細配置信息歪赢。這一節(jié)李的屬性只可以被寫在根配置中,不可以寫在子配置中导梆。

note:以下的順序做了一下調(diào)整轨淌,與官網(wǎng)不同迂烁。我將必須配置的選項提到前面,方便查閱递鹉。

2.1 name (必須配置)

這個代表了pod庫的名稱盟步。

spec.name = 'AFNetworking'

2.2 version (必須配置)

這個代表了pod庫的版本。cocoapods遵循semantic versioning(一個版本號管理標(biāo)準)

spec.version = '0.0.1'

2.3 authors (必須配置)

庫的作者和郵件地址躏结。

spec.name = 'ErMao'
spec.name = 'ErMao','YiPing'
spec.name = {'ErMao' => '123@qq.com','YiPing' => '321@qq.com'}

2.4 license (必須配置)

庫的開源協(xié)議却盘。

除非源文件中包含文件名為LICENSE.*或者LICENCE.*的文件,必須要指定協(xié)議的完整路徑媳拴。一旦指定了協(xié)議文件黄橘,要么是個沒有擴展名的文件,要么是txt屈溉、md塞关、markdown的其中之一。

spec.license = 'MIT'

spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt' }

spec.license = { :type => 'MIT', :text => <<-LICENSE
                   Copyright 2012
                   Permission is granted to...
                 LICENSE
}

2.5 homepage (必須配置)

庫的主頁子巾。

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

2.6 source (必須配置)

庫存放的地址帆赢。

指定一個帶有tag的git源。tag就是對commit打的標(biāo)簽线梗,通過這個可以區(qū)分版本椰于。

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

在tag前面加v前綴和子模塊

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

支持的關(guān)鍵字

:git => :tag, :branch, :commit, :submodules

:svn => :folder, :tag, :revision

:hg => :revision

:http => :flatten, :type, :sha256, :sha1

2.7 summary (必須配置)

一個pod庫的140之內(nèi)的小簡介。summary需要注意大寫和正確的標(biāo)點符號立膛。

spec.summary = 'Some lalalal.'

2.8 swift_versions

指定swift的版本號。版本號'4'會被cocoapods處理成'4.0'梯码,而不是'4.1'或者'4.2'宝泵。

note:Swfit編譯器主要接受大版本,有時候也會接受小版本轩娶。雖然cocoapods接受指定一個小版本或者次要的版本儿奶,但是swift不一定會完全支持。

spec.swift_versions = ['3.0','4.0','4.2']

2.9 cocoapods_version

cocoapods的版本號鳄抒。

spec.cocoapods_version = '>= 1.5.0'

2.10 description

比上面的那個summary更詳細的說明闯捎。

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

2.11 screenshots

用來展示pod庫的一組圖片椰弊,cocoapods更建議使用gif格式的。

spec.screenshots = [ 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png',
                     'http://dl.dropbox.com/u/378729/MBProgressHUD/2.png' ]

2.12 documentation_url

一個存放說明文檔的地址瓤鼻。

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

2.13 prepare_command

一個pod被下載完成后將要被執(zhí)行的腳本秉版。這個命令可以被用來創(chuàng)建,刪除修改任何下載的文件茬祷,并且在配置文件的其他屬性被收集之前運行清焕。

這個在pod 被清除和pod被創(chuàng)建之前運行。運行的路徑是根路徑祭犯。

如何pod通過:path選項安裝秸妥,那么command將不會執(zhí)行。

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

2.14 static_framework

如果使用了 use_frameworks!(在podfile中標(biāo)記)沃粗,pod將要包含一個靜態(tài)庫粥惧。

2.15 deprecated

標(biāo)記著庫被棄用了。

spec.deprecated = true

三 : Platform

一個配置文件應(yīng)該標(biāo)明對應(yīng)的平臺和對應(yīng)的部署tagets最盅。如果沒有在subspec中標(biāo)明影晓,那就繼承父親的值。

3.1 platform

標(biāo)明支持的平臺檩禾,如果為空挂签,一位置所有的平臺都可以支持。如果支持多平臺盼产,就使用下方的deployment_target饵婆。

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

3.2 deployment_target

支持平臺的最小編譯版本。

與platform不同的是戏售,這個屬性允許指定多個平臺侨核。

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

四:build settings(構(gòu)建配置)

這一組主要是列舉了創(chuàng)建庫所需要的構(gòu)建配置,如果subspec(子配置)中沒有定義灌灾,那么將主動繼承父親的值搓译。這里的值都是可以從子類配置的。與(二)中的區(qū)別開锋喜。

note:在翻譯過程中發(fā)現(xiàn)很多是官方不建議使用的屬性些己,這里直接屏蔽,也沒必要看嘿般。

4.1 dependency

添加依賴段标。

依賴可以指定版本需求,表達式 是 ~> 炉奴,比如 ~> 1.0.1 意思就是 >= 1.0.1并且 < 1.1 逼庞。類似的 ~> 1.0 會匹配到1.0,1.0.1等瞻赶,不會升級到2.0.

sepc.dependency 'AFNetworking', '~> 1.0'

4.2 requires_arc

這個屬性允許指出哪一個source_file使用arc赛糟∨扇危可以指定某個文件使用arc,也可以設(shè)置 true or false 來指定整個源文件璧南。

不使用ARC的文件掌逛,需要有-fno-objc-arc編譯器標(biāo)識。

默認值是true

spec.requires_arc = true
spec.requires_arc = false
spec.requires_arc = 'Classes/Arc'
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']

4.3 frameworks

需要鏈接的framework列表穆咐。

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

4.4 weak_frameworks

需要弱鏈接的庫列表颤诀。

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

4.5 libraries

需要鏈接的系統(tǒng)庫列表。

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

4.6 compiler_flags

編譯器標(biāo)識对湃,可以將值傳遞給編譯器崖叫。

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

4.7 module_name

這個名字用于框架或者clang模塊的名稱,該模塊會根據(jù)spec生成拍柒,而不使用默認名稱心傀。

spec.module_name = 'Three20'

4.8 header_dir

整體的頭文件。包含了其他用得到的頭文件拆讯,避免分開導(dǎo)入

spec.header_dir = 'Three20Core'

4.9 header_mappings_dir

保存頭文件夾的目錄脂男。

spec.header_mappings_dir = 'src/include'

4.10 script_phases

這個腳本是作為pod的編譯的一部分,但是與prepare command不同种呐,script是作為xcodebuild的一部分執(zhí)行的宰翅,腳本可以利用編譯器的一切環(huán)境變量。腳本的執(zhí)行順序是按照聲明順序執(zhí)行的爽室。

note:為了提供透明性汁讼,如果庫里包含腳本,那么將會對用戶有一個提醒阔墩。

spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"' }

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

五 : File patterns(文件模式嘿架、類型)

這里主要了解一下cocoapods文件的通配符。因為 podspec文件是放到根目錄的啸箫,所以是不支持 '..' 的耸彪。

*:一般意義上的通配符,意思就是全匹配忘苛。c*就是c開頭的蝉娜,*c就是c結(jié)尾的。與正則 /.*/x一樣

**:遞歸文件夾

柑土?:匹配任何字符

[set]:匹配數(shù)組里面的任意字符

{p,q}:匹配p或者匹配q

\:轉(zhuǎn)義

"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"]

5.1 source_file

源文件蜀肘。

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

5.2 public_header_files

用來做公共頭文件的文件列表。這些頭文件是要給用戶看的稽屏,并且可以根據(jù)這些生成對應(yīng)的文檔,當(dāng)庫被構(gòu)建的時候西乖,這些頭文件將要在構(gòu)建的文件夾中出現(xiàn)狐榔。如果沒有指定公共頭文件坛增,那么source_file里的頭文件都會被視為公開的。

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

5.3 exclude_files

從文件列表中剔除的文件

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

六 : Subspecs

子說明薄腻。

6.1 subspec

代表了一個庫的其中一個模塊的說明收捣。

一方面,一個說明書將會自動的作為children的子說明書(除非一個默認的子說明書被指定)庵楷。另一方面罢艾,一個子說明從父說明繼承屬性的值,所以公共屬性的值可以在父說明中被指定尽纽。

比如說ShareKit/Evernote, ShareKit/Facebook咐蚯。

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

只是添加shareKit的其中的兩個部分,注意:在這種情況下弄贿,子說明將要編譯需要的源文件春锋,依賴以及其他通過根說明定義的屬性。cocoapods非常智能差凹,可以來處理任何來自屬性的沖突期奔。

有著不同源文件的子說明

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

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

引用對其他子說明依賴關(guān)系的子說明。

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

嵌套的子說明

Pod::Spec.new do |s|
  s.name = 'Root'

  s.subspec 'Level_1' do |sp|
    sp.subspec 'Level_2' do |ssp|
    end
  end
end

6.2 requires_app_host

這個屬性標(biāo)明危尿,測試是否需要在app的主機進行測試呐萌。這個屬性只是在測試說明中有用。

test_spec.requires_app_host = true

6.3 test_spec

測試說明谊娇。在這里可以放置針對于podspec的所有測試肺孤。

Pod::Spec.new do |spec|
  spec.name = 'NSAttributedString+CCLFormat'

  spec.test_spec do |test_spec|
    test_spec.source_files = 'NSAttributedString+CCLFormatTests.m'
    test_spec.dependency 'Expecta'
  end
end

6.4 app_spec

表示庫的應(yīng)用程序說明。在這里邮绿,可以為podspec放置所有應(yīng)用程序源文件以及應(yīng)用程序依賴項渠旁。

Pod::Spec.new do |spec|
  spec.name = 'NSAttributedString+CCLFormat'

  spec.app_spec do |app_spec|
    app_spec.source_files = 'NSAttributedString+CCLFormat.m'
    app_spec.dependency 'AFNetworking'
  end
end

七 : Multi-Platform support(多平臺支持)

說明書可以存儲指定平臺的相關(guān)值。

spec.resources = 'Resources/**/*.png'
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}'

八 : 結(jié)束語

以上就是podspec的相關(guān)文檔的翻譯船逮,這里我刪減了一些不常用的顾腊,官方不推薦的使用的屬性。這個可以作為一個podspec的開發(fā)手冊挖胃。如果有什么問題杂靶,大家可以在留言板直接留言。我會及時跟大家討論并更正問題酱鸭。

如果您覺得對您有用吗垮,不妨點個贊唄,轉(zhuǎn)載請注明

我是二毛凹髓,一個集智慧和逗比于一身的iOSer??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烁登,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔚舀,更是在濱河造成了極大的恐慌饵沧,老刑警劉巖锨络,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狼牺,居然都是意外死亡羡儿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門是钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掠归,“玉大人,你說我怎么就攤上這事悄泥÷捕常” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵码泞,是天一觀的道長兄旬。 經(jīng)常有香客問我,道長余寥,這世上最難降的妖魔是什么领铐? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宋舷,結(jié)果婚禮上绪撵,老公的妹妹穿的比我還像新娘。我一直安慰自己祝蝠,他們只是感情好音诈,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绎狭,像睡著了一般细溅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡嘶,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天喇聊,我揣著相機與錄音,去河邊找鬼蹦狂。 笑死誓篱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凯楔。 我是一名探鬼主播窜骄,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摆屯!你這毒婦竟也來了邻遏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎党远,沒想到半個月后削解,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體富弦,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡沟娱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坏匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩郊。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衍腥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砰蠢,到底是詐尸還是另有隱情,我是刑警寧澤唉铜,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布台舱,位于F島的核電站,受9級特大地震影響潭流,放射性物質(zhì)發(fā)生泄漏竞惋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一灰嫉、第九天 我趴在偏房一處隱蔽的房頂上張望拆宛。 院中可真熱鬧,春花似錦讼撒、人聲如沸浑厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钳幅。三九已至,卻和暖如春炎滞,著一層夾襖步出監(jiān)牢的瞬間敢艰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工厂榛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盖矫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓击奶,卻偏偏與公主長得像辈双,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柜砾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353