概述
距離上一篇podfile介紹過去已經(jīng)幾個月了询张,很想抽時間將這個系列的文章抓緊補齊孙乖,但是時間一拖再拖,我也不想找什么理由份氧〉脑玻總結(jié)一下就是兩個原因。
- 1.最近工作比較忙(這其實是一個借口)
- 2.確實是比較懶??半火。
今天來把這個坑補一下越妈。
這個系列的前兩篇文章,其實都是在翻譯cocoapods官方文檔钮糖,也加入了一些自己的理解梅掠,并且對文檔說明不清的地方做了補充,若有翻譯不清楚的地方或者理解不清的地方店归,大家直接在評論里提出來即可阎抒。我看到了就會修改的。
該系列文章鏈接
- 1.podfile相關(guān)內(nèi)容
- 2.podspec相關(guān)內(nèi)容
- 3.搭建私有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??