前言:在構(gòu)建自己的組件庫中薪缆,我們會經(jīng)常編輯
.podspec
文件漾唉,進(jìn)行一些配置項,但是有一些確實還是不太清楚膛壹,這里統(tǒng)一學(xué)習(xí)一下窑滞,內(nèi)容翻譯自官方文檔:https://guides.cocoapods.org/syntax/podspec.html。
1. Specification (規(guī)范)
Specification
描述了關(guān)于Pod庫所有配置恢筝。包括從何處獲取源代碼哀卫、使用哪些文件、應(yīng)用構(gòu)建設(shè)置以及其他一般元數(shù)據(jù)(如名稱撬槽、版本和描述)的詳細(xì)信息此改。
可以直接使用pod spec create
命令來為已有組件項目生成一個.podspec
文件。但是一般我們創(chuàng)建組件時都會使用pod lib init
命令侄柔,會同時生成.podspec
文件共啃。
來看一個比較簡單的.podspec
文件,內(nèi)容如下:
Pod::Spec.new do |spec|
spec.name = 'JJKit'
spec.version = '0.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://gitee.com/nick5683/JJKit'
spec.authors = { 'Nick5683' => 'nick5683@qq.com' }
spec.summary = 'JJkit contains class extension and other custom functions.'
spec.source = { :git => 'https://gitee.com/nick5683/JJKit.git', :tag => '0.1.0' }
spec.source_files = 'Classes/*/*'
spec.framework = 'SystemConfiguration'
end
再看一個比較詳細(xì)的暂题,內(nèi)容如下:
Pod::Spec.new do |spec|
spec.name = 'JJKit'
spec.version = '0.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://gitee.com/nick5683/JJKit'
spec.authors = { 'Nick5683' => 'nick5683@qq.com' }
spec.summary = 'JJkit contains class extension and other custom functions.'
spec.source = { :git => 'https://gitee.com/nick5683/JJKit.git', :tag => '0.1.0' }
spec.module_name = 'Rich'
spec.swift_version = '5.2'
spec.ios.deployment_target = '9.0'
spec.osx.deployment_target = '10.10'
spec.source_files = 'Classes/*/*'
spec.ios.source_files = 'Classes/ios/*.swift', 'Classes/extensions/*.swift'
spec.osx.source_files = 'Classes/osx/*.swift'
spec.framework = 'SystemConfiguration'
spec.ios.framework = 'UIKit'
spec.osx.framework = 'AppKit'
spec.dependency 'SomeOtherPod'
end
有一些是我們常見的移剪,有的是還沒有見過的,這次都來了解并學(xué)習(xí)一下薪者。
2. Root specification (根規(guī)范)
Root specification
應(yīng)用于整個pod庫纵苛,包含分為必填和選填項。
選項 | 是否必填 | 描述 |
---|---|---|
name | 必填 | 庫的名字 |
version | 必填 | 庫的版本號 |
swift_versions | 選填 | 支持的Swift版本 |
cocoapods_version | 選填 | 支持的cocoapods版本 |
authors | 必填 | 作者信息 |
social_media_url | 選填 | 作者第三方社交平臺url |
license | 必填 | 許可證 |
homepage | 必填 | pod首頁地址 |
readme | 選填 | readme文件地址 |
changelog | 選填 | changelog文件地址 |
source | 必填 | 源文件地址 |
summary | 必填 | 庫描述 |
description | 選填 | 庫詳細(xì)描述 |
screenshots | 選填 | 庫的截圖 |
documentation_url | 選填 | 庫的文檔url |
prepare_command | 選填 | 在安裝前執(zhí)行的腳本 |
static_framework | 選填 | 是否是靜態(tài)framework的形式 |
deprecated | 選填 | 標(biāo)記庫是否被廢棄 |
deprecated_in_favor_of | 選填 | 標(biāo)明庫的名字被廢棄 |
2.1 name (必填)
pod
庫的名字,我們搜索和導(dǎo)入的時候都會用到名字攻人。
spec.name = 'AFNetworking'
2.2 version(必填)
pod
庫的版本號取试,一般都會和打的標(biāo)簽保持一致。
spec.version = '0.0.1'
2.3 swift_versions(選填)
規(guī)范支持的Swift版本怀吻。CocoaPods會將“4”視為“4.0”瞬浓,而不是“4.1”或“4.2”。
注意:Swift編譯器主要接受主版本蓬坡,有時也會支持小版本猿棉。雖然CocoaPods允許指定小版本或補(bǔ)丁版本,但Swift編譯器可能不會完全遵守屑咳。
# 支持多種寫法
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'
2.4 cocoapods_version(選填)
規(guī)范支持的CocoaPods版本铺根。
spec.cocoapods_version = '>= 0.36'
2.5 authors(必填)
作者。
spec.author = 'Darth Vader'
spec.authors = 'Darth Vader', 'Wookiee'
spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
'Wookiee' => 'wookiee@aggrrttaaggrrt.com' }
2.6 social_media_url(必填)
Pod的社交媒體聯(lián)系人的URL乔宿, CocoaPods網(wǎng)絡(luò)服務(wù)可以使用這個位迂。
spec.social_media_url = 'https://twitter.com/cocoapods'
spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'
2.7 license (必填)
Pod許可證。
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.8 homepage (必填)
Pod主頁的URL详瑞。
spec.homepage = 'http://www.example.com'
2.9 readme(選填)
此pod版本的README markdown文件的URL掂林。
spec.readme = 'https://www.example.com/Pod-1.5-README.md'
2.10 changelog(選填)
此pod版本的CHANGELOG markdown文件的URL。
spec.changelog = 'https://www.example.com/Pod-1.5-CHANGELOG.md'
2.11 source(選填)
應(yīng)該從何處檢索庫的位置坝橡。
- 使用
tag
指定一個Git源文件泻帮,比較常用:
spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
:tag => spec.version.to_s }
- 使用以'v'和子模塊為前綴的標(biāo)簽
spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git',
:tag => "v#{spec.version}", :submodules => true }
還有一些不常用的,比如支持下載zip文件计寇,可以從官網(wǎng)上看到锣杂。
支持的keys:
:git => :tag, :branch, :commit, :submodules
:svn => :folder, :tag, :revision
:hg => :revision
:http => :flatten, :type, :sha256, :sha1, :headers
2.12 summary(選填)
對Pod的簡短描述(最多140個字符)。
spec.summary = 'Computes the meaning of life.'
2.13 description(選填)
對Pod的描述比summary
更詳細(xì)番宁。
spec.description = <<-DESC
Computes the meaning of life.
Features:
1. Is self aware
...
42. Likes candies.
DESC
2.14 screenshots(選填)
展示Pod截圖的url列表元莫。CocoaPods推薦使用gif格式。
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' ]
2.15 documentation_url(選填)
一個可選的Pod文檔URL蝶押,默認(rèn)為CocoaDocs生成的庫URL踱蠢。
spec.documentation_url = 'http://www.example.com/docs.html'
2.16 prepare_command(選填)
下載Pod后執(zhí)行的bash腳本。該命令可用于創(chuàng)建棋电、刪除和修改下載的任何文件茎截,并且將在該規(guī)范的其他文件屬性的任何路徑被收集之前運(yùn)行該命令。
此命令在清理Pod和創(chuàng)建Pod project項目之前執(zhí)行赶盔。工作目錄為Pod的根目錄企锌。
如果pod導(dǎo)入時使用了:path選項,則不會執(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.17 static_framework(選填)
如果use_frameworks!指定時撕攒,pod應(yīng)該包含一個靜態(tài)庫framework陡鹃。
spec.static_framework = true
2.18 deprecated(選填)
標(biāo)記庫是否已經(jīng)廢棄不用。
spec.deprecated = true
2.19 deprecated_in_favor_of(選填)
這個Pod庫的名字已經(jīng)被棄用了打却。
spec.deprecated_in_favor_of = 'NewMoreAwesomePod'
3. Platform
規(guī)范應(yīng)該指明支持庫的平臺和相應(yīng)的部署目標(biāo)。
3.1 platform
支持當(dāng)前Pod庫的平臺谎倔。不填則表示所有平臺都支持該P(yáng)od庫柳击。當(dāng)支持多個平臺時,你應(yīng)該使用下面的deployment_target
片习。
spec.platform = :osx, '10.8'
spec.platform = :ios
spec.platform = :osx
3.2 deployment_target
支持platform
的最小部署目標(biāo)捌肴。
與platform
屬性相反,deployment_target
屬性允許指定支持此pod的多個平臺藕咏,就是為每個platform
指定不同的部署目標(biāo)状知。
spec.ios.deployment_target = '6.0'
spec.osx.deployment_target = '10.8'
4. Build settings
在該組中列出了與應(yīng)用構(gòu)建環(huán)境配置相關(guān)的屬性。
選項 | 是否必填 | 描述 |
---|---|---|
dependency | 選填 | 依賴庫 |
info_plist | 選填 | 鍵值對 |
requires_arc | 選填 | 文件內(nèi)存管理方式 |
frameworks | 選填 | 鏈接系統(tǒng)framework列表(required) |
weak_frameworks | 選填 | 弱鏈接系統(tǒng)framework列表(optional) |
libraries | 選填 | 系統(tǒng)library |
compiler_flags | 選填 | 傳遞給編譯器的標(biāo)志列表 |
pod_target_xcconfig | 選填 | <看注解> |
user_target_xcconfig | 選填 | <看注解> |
prefix_header_contents | 選填 | <看注解> |
prefix_header_file | 選填 | <看注解> |
module_name | 選填 | 該規(guī)范生成的用于framework / clang module 的名稱 |
header_dir | 選填 | 存放頭文件的目錄 |
script_phases | 選填 | 允許定義腳本階段孽查,以作為Pod編譯的一部分執(zhí)行 |
4.1 dependency
標(biāo)明對其他pod庫或者子庫的依賴饥悴。
如果這里指定版本過于嚴(yán)格,會限制它們與其他pod的兼容性盲再。
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'
4.2 info_plist (multi-platform)
要添加到生成的Info.plist中的鍵值對西设。
對于library specs
,這些值將合并到生成的framework的Info.plist中
答朋,它對靜態(tài)庫沒有影響贷揽,不支持subspecs
。對于app specs
梦碗,這些值將合并到主應(yīng)用的Info.plist中禽绪。
spec.info_plist = {
'CFBundleIdentifier' => 'com.myorg.MyLib',
'MY_VAR' => 'SOME_VALUE'
}
4.3 requires_arc (默認(rèn)為true)
requires_arc
允許指定哪些source_files
使用ARC『楣妫可以設(shè)置為true表示所有source_files使用ARC印屁。不使用ARC的文件會有-fno-objc-arc
編譯標(biāo)志。
spec.requires_arc = true
spec.requires_arc = 'Classes/Arc'
spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']
4.4 frameworks (multi-platform)
用戶的target需要鏈接的系統(tǒng)framework列表斩例。
spec.ios.framework = 'CFNetwork'
spec.frameworks = 'QuartzCore', 'CoreData'
4.5 weak_frameworks (multi-platform)
用戶的目標(biāo)需要弱鏈接
的框架列表库车。
spec.weak_framework = 'Twitter'
spec.weak_frameworks = 'Twitter', 'SafariServices'
4.6 libraries (multi-platform)
用戶的目標(biāo)(應(yīng)用程序)需要鏈接的系統(tǒng)庫的列表。
spec.ios.library = 'xml2'
spec.libraries = 'xml2', 'z'
4.7 compiler_flags (multi-platform)
應(yīng)該傳遞給編譯器的標(biāo)志列表樱拴。
spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
4.8 pod_target_xcconfig (multi-platform)
要添加到最終私有pod target 的 xcconfig文件中的任何標(biāo)志柠衍。
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
4.9 user_target_xcconfig (multi-platform)
指定要添加到最終聚合target(項目工程target)的xcconfig文件的標(biāo)志。
不建議使用此屬性晶乔,因為Pods不應(yīng)該污染用戶項目的構(gòu)建設(shè)置珍坊,這可能會導(dǎo)致沖突。建議使用
pod_target_xcconfig
正罢。
spec.user_target_xcconfig = { 'MY_SUBSPEC' => 'YES' }
4.10 prefix_header_contents (multi-platform)
要注入到pod項目前綴頭中的任何內(nèi)容阵漏。
不建議使用此屬性,因為Pods不應(yīng)該污染其他庫或用戶項目的前綴頭。
spec.prefix_header_contents = '#import <UIKit/UIKit.h>'
spec.prefix_header_contents = '#import <UIKit/UIKit.h>', '#import <Foundation/Foundation.h>'
4.11 prefix_header_file (multi-platform)
要注入到pod項目的前綴頭文件中的前綴頭文件的路徑履怯。
不建議使用文件路徑選項回还,因為Pods不應(yīng)該污染其他庫或用戶項目的前綴頭。
spec.prefix_header_file = 'iphone/include/prefix.pch'
spec.prefix_header_file = false
4.12 module_name
該規(guī)范生成的用于framework / clang module 的名稱叹洲,而不是默認(rèn)名稱(如果設(shè)置header_dir柠硕,否則為規(guī)范名稱)。
spec.module_name = 'Three20'
4.13 header_dir (multi-platform)
存放頭文件的目錄运提,這樣它們就不會破壞include蝗柔。
spec.header_dir = 'Three20Core'
4.14 header_dir (multi-platform)
保存頭文件的文件夾結(jié)構(gòu)的目錄。如果沒有提供民泵,頭文件將被flattened癣丧。
spec.header_dir = 'Three20Core'
4.15 script_phases (multi-platform)
此屬性允許定義腳本階段,以作為Pod編譯的一部分執(zhí)行栈妆。與prepare command
不同胁编,腳本階段作為xcodebuild的一部分執(zhí)行
,它們還可以使用編譯期間設(shè)置的所有環(huán)境變量
鳞尔。
Pod可以提供多個腳本階段來執(zhí)行掏呼,它們將按照聲明的順序添加。
注意:為了提供所有腳本階段的內(nèi)容的可見性铅檩,如果pod包含任何腳本憎夷,安裝時將向用戶顯示一個警告。
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' },
]
5. File patterns(文件模式)
5.1 File patterns
Podspecs
應(yīng)該位于庫文件夾的根目錄
昧旨,并且文件的路徑也應(yīng)該相對于存儲庫的目錄指定拾给。文件模式不支持遍歷父目錄(…). 文件模式可能包含以下通配符模式:
5.1.1 Pattern: *
匹配任何文件,可以被glob中的其他值限制:
*
匹配所有文件
c*
匹配以c開頭的文件
*c
匹配以c結(jié)尾的文件
*c*
匹配包含c的文件
5.1.2 Pattern: **
目錄遞歸地匹配兔沃。
5.1.3 Pattern: ?
匹配任意一個字符蒋得。相當(dāng)于 正則表達(dá)式中的/.{1}/
。
5.1.4 Pattern: [set]
匹配集合中的任意一個字符乒疏。
行為與正則表達(dá)式中的字符集完全一樣额衙,包括反集([^a-z]
)。
5.1.4 Pattern: {p,q}
匹配字面值p或字面值q怕吴。等價于正則表達(dá)式中的模式變換窍侧。
5.1.5 Pattern: \
轉(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.2 source_files (multi-platform)
pod庫中包含的源文件转绷。
spec.source_files = 'Classes/**/*.{h,m}'
spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
5.3 public_header_files (multi-platform)
作為公共頭的文件模式列表伟件。
這些文件模式將與源文件進(jìn)行匹配,以包含將向主項目公開的頭文件议经,并從中生成文檔斧账。當(dāng)構(gòu)建庫時谴返,這些頭文件將出現(xiàn)在構(gòu)建目錄中。如果沒有指定公共頭文件咧织,那么source_files中的所有頭文件都被認(rèn)為是公共的嗓袱。
spec.public_header_files = 'Headers/Public/*.h'
5.4 project_header_files (multi-platform)
作為項目頭的文件模式列表。
這些文件模式將與public headers
進(jìn)行匹配习绢,以排除那些不應(yīng)公開給用戶項目和不應(yīng)用于生成文檔的headers
渠抹。當(dāng)構(gòu)建庫時,這些頭文件將不會出現(xiàn)在構(gòu)建目錄中毯炮。
spec.project_header_files = 'Headers/Project/*.h'
5.5 private_header_files (multi-platform)
作為私有頭的文件模式列表逼肯。
這些模式將與public headers
進(jìn)行匹配耸黑,以排除那些不應(yīng)公開給用戶項目和不應(yīng)用于生成文檔的標(biāo)頭桃煎。當(dāng)構(gòu)建庫時,這些頭文件將出現(xiàn)在構(gòu)建目錄中大刊。
未被列為公共为迈、項目或私有文件的頭文件會出現(xiàn)在構(gòu)建目錄中。
spec.private_header_files = 'Headers/Private/*.h'
5.6 vendored_frameworks (multi-platform)
Pod所依賴的的framework的路徑缺菌,同時支持.framework和.xcframework包葫辐。這些框架將提供給Pod和Pod的消費(fèi)者。
spec.ios.vendored_frameworks = 'Frameworks/MyFramework.framework'
spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.xcframework'
5.7 vendored_libraries (multi-platform)
Pod所依賴的庫(.a文件)的路徑伴郁。
spec.ios.vendored_library = 'Libraries/libProj4.a'
spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
5.8 on_demand_resources (multi-platform)
應(yīng)復(fù)制到目標(biāo)target中的隨需應(yīng)變資源的哈希值耿战。這里指定的資源將自動成為集成此pod的target的資源構(gòu)建階段的一部分。
由pods指定的tag是由CocoaPods管理的焊傅。如果一個標(biāo)簽被重命名剂陡、更改或刪除,那么CocoaPods也會在工程target中進(jìn)行更新狐胎。
s.on_demand_resources = {
'Tag1' => 'file1.png'
}
s.on_demand_resources = {
'Tag1' => ['file1.png', 'file2.png']
}
s.on_demand_resources = {
'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :download_on_demand }
}
s.on_demand_resources = {
'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :initial_install }
}
5.9 resource_bundles (multi-platform)
這個屬性允許為pod構(gòu)建使用的資源包定義name鸭栖。就是一個鍵值對,其中key表示包的名稱握巢,value表示它們應(yīng)該包含的文件模式的值晕鹊。
為了將Pod構(gòu)建為一個靜態(tài)庫,推薦采用
resource_bundles
暴浦,因為使用resources
屬性可能會產(chǎn)生名稱沖突溅话。
使用resource_bundles
會在主bundle中生成一個自定義的bundle,bundle中存放著資源歌焦。讀取資源時需要到對應(yīng)bundle下讀取公荧。這種方式可以避免命名沖突。
包的名稱至少應(yīng)該包含Pod的名稱同规,以盡量減少名稱沖突的機(jī)會循狰。
spec.resources = ['Resources/Assets/*.xcassets']
spec.ios.resource_bundle = { 'MapBox' => 'Resources/*.png' }
spec.resource_bundles = {
'MapBox' => ['Resources/*.png'],
'MapBoxOtherResources' => ['OtherResources/*.png']
}
5.10 resources (multi-platform)
應(yīng)該復(fù)制到目標(biāo)target bundle
中的資源列表窟社。
使用
resources
會在主bundle中導(dǎo)入。這種方式讀取圖片不需要修改讀取方式绪钥。
為了將Pod構(gòu)建為一個靜態(tài)庫灿里,強(qiáng)烈建議采用resource_bundles
,因為使用resources
屬性可能會產(chǎn)生名稱沖突
程腹。此外匣吊,用這個屬性指定的資源會直接復(fù)制到客戶端目標(biāo)中,因此它們不會被Xcode優(yōu)化寸潦。
spec.resource = 'Resources/HockeySDK.bundle'
spec.resources = ['Images/*.png', 'Sounds/*']
5.11 exclude_files (multi-platform)
應(yīng)該從其他文件模式中排除的文件模式列表色鸳。
spec.ios.exclude_files = 'Classes/osx'
spec.exclude_files = 'Classes/**/unused.{h,m}'
5.12 preserve_paths (multi-platform)
下載后不應(yīng)刪除的任何文件。
默認(rèn)情況下见转,CocoaPods刪除所有與任何其他文件模式不匹配的文件命雀。
spec.preserve_path = 'IMPORTANT.txt'
spec.preserve_paths = 'Frameworks/*.framework'
5.13 module_map (multi-platform)
當(dāng)此pod集成為framework時應(yīng)該使用的模塊映射文件。
false表示不應(yīng)該生成默認(rèn)的CocoaPods modulemap文件斩箫。
true為默認(rèn)值吏砂,表示應(yīng)該生成默認(rèn)的CocoaPods modulemap文件。
默認(rèn)情況下乘客,CocoaPods根據(jù)規(guī)范中的公共頭文件創(chuàng)建模塊映射文件狐血。
spec.module_map = 'source/module.modulemap'
spec.module_map = false
作者:code_ce
鏈接:http://www.reibang.com/p/8c6941778f0e
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)易核,非商業(yè)轉(zhuǎn)載請注明出處匈织。