Cocoapods整理(三)——編寫(xiě)podspec文件

From: https://segmentfault.com/a/1190000012269307

![][1]飛花蝶舞劍發(fā)布于 2017-12-04


前言

看到pod上各種形形色色的三方庫(kù)沐悦,自己肯定也會(huì)想要?jiǎng)?chuàng)建一個(gè)分享一下份乒。做組件化時(shí)也會(huì)想要將項(xiàng)目拆分成一個(gè)一個(gè)的私有庫(kù)馅闽。而使用pod管理三方庫(kù)或私有庫(kù)最重要的就是要學(xué)會(huì)如何寫(xiě)podsepc文件。 

以下均以我自己寫(xiě)的一個(gè)私有庫(kù)ZCPKit去介紹玲献。


目錄

  • 如何創(chuàng)建podspec文件
  • 如何編寫(xiě)podspec文件
  • 如何實(shí)現(xiàn)目錄分層
  • 如何校驗(yàn)podspec文件
  • 別人寫(xiě)的例子
  • 補(bǔ)充 校驗(yàn)時(shí)出現(xiàn)的一些問(wèn)題

1.如何創(chuàng)建podspec文件

創(chuàng)建podspec文件只需要一行命令拓挥,在你自己的三方庫(kù)的根目錄下輸入下面的命令:

pod spec create XXXKit

例如我自己的ZCPKit

然后在項(xiàng)目目錄下將會(huì)生成一個(gè)podspec文件

2.如何編寫(xiě)podspec文件

我們先來(lái)打開(kāi)ZCPKit.podspec文件看看里面的內(nèi)容论颅『懿矗基本都是針對(duì)ZCPKit的描述和介紹。

一些常用的信息介紹:

name:框架名
version:當(dāng)前版本(注意苦蒿,是當(dāng)前版本殴胧,假如你后續(xù)更新了新版本,需要修改此處)
summary:簡(jiǎn)要描述佩迟,在pod search ZCPKit的時(shí)候會(huì)顯示該信息团滥。
description:詳細(xì)描述
homepage:頁(yè)面鏈接
license:開(kāi)源協(xié)議
author:作者
source:源碼git地址
platform:支持最低ios版本
source_files:源文件(可以包含.h和.m)
public_header_files:頭文件(.h文件)
resources:資源文件(配置的文件都會(huì)被放到mainBundle中)
resource_bundles:資源文件(配置的文件會(huì)放到你自己指定的bundle中)
frameworks:依賴的系統(tǒng)框架
vendored_frameworks:依賴的非系統(tǒng)框架
libraries:依賴的系統(tǒng)庫(kù)
vendored_libraries:依賴的非系統(tǒng)的靜態(tài)庫(kù)
dependency:依賴的三方庫(kù)

上面列舉的信息大部分來(lái)自pod默認(rèn)生成的podspec文件中的給的,其中需要重點(diǎn)注意標(biāo)識(shí)黑體的這幾個(gè)信息报强。

你在三方庫(kù)中看到的那些文件都是通過(guò)這些配置來(lái)確定的灸姊。當(dāng)pod install引入三方庫(kù)時(shí),只會(huì)引入你在podspec中配置的那些文件秉溉。

下面我會(huì)舉例說(shuō)明該如何寫(xiě)podsepc中的每項(xiàng)配置力惯。

目錄結(jié)構(gòu)如下

ZCPKit
┗━━━━Classes
     ┗━━━━ZCPKit.h
     ┗━━━━ZCPKit.m
┗━━━━Frameworks
     ┗━━━━MyFramework.framework
┗━━━━Libraries
     ┗━━━━libZCPKit.a
┗━━━━Resources
     ┗━━━━MyRes.bundle

如圖所示的目錄結(jié)構(gòu),每個(gè)配置項(xiàng)的寫(xiě)法如下:

source_files:配置三方庫(kù)的源文件(.h或.m文件)

寫(xiě)法:
source_files = 'Classes/ZCPKit.{h,m}' // 直接指定文件名
或:
source_files = 'Classes/*.{h,m}' // Classes文件夾下的所有匹配文件
source_files = 'Classes/**/*.{h,m}' // Classes所有路徑下的所有匹配文件

public_header_files:配置公有的頭文件(.h文件)

寫(xiě)法:
source_files = 'Classes/ZCPKit.h' // 直接指定文件名
或:
source_files = 'Classes/*.h' // Classes文件夾下的所有匹配文件
source_files = 'Classes/**/*.h' // Classes所有路徑下的所有匹配文件

vendored_frameworks:配置需要引用的非系統(tǒng)框架(****/的寫(xiě)法后面不再贅述*)

寫(xiě)法:
vendored_frameworks = 'Frameworks/MyFramework.framework'

frameworks:配置依賴的系統(tǒng)框架

寫(xiě)法:
frameworks = 'AVFoundation', 'CoreGraphics', 'Security', 'SystemConfiguration'

vendored_libraries:配置需要引用的非系統(tǒng)靜態(tài)庫(kù)(要注意召嘶,這里的.a靜態(tài)庫(kù)名字必須要帶lib前綴父晶,如果引用的靜態(tài)庫(kù)名字沒(méi)lib前綴會(huì)導(dǎo)致編譯報(bào)錯(cuò),只需要重命名加上即可

寫(xiě)法:
vendored_libraries = 'Frameworks/libZCPKit.a'

libraries:配置依賴的系統(tǒng)庫(kù)(要注意苍蔬,這里的寫(xiě)法需要忽略lib前綴

寫(xiě)法:
libraries = 'c++', 'sqlite3', 'stdc++.6.0.9', 'z'

resources:配置資源文件(.bundle诱建,.png,.txt等資源文件碟绑,這些資源文件會(huì)被放到mainBundle中俺猿,要注意避免發(fā)生命名重復(fù)的問(wèn)題

寫(xiě)法:
resources = 'Resources/MyRes.bundle'

resource_bundles:配置指定bundle的資源文件(可以解決resources導(dǎo)致的命名沖突問(wèn)題

寫(xiě)法:
resource_bundles = {
    'ZCPKitBundle' => ['Resources/MyRes.bundle'],
}

dependency:依賴的三方庫(kù),pod庫(kù)或者可以是自身的subspec

寫(xiě)法:
dependency 'AFNetworking', '~>3.1.0' // pod三方庫(kù)
dependency 'Util' // 自身的subspec
或
dependency 'AFNetworking'

附上官網(wǎng)鏈接格仲,可以去看一看:podspec
關(guān)于更詳細(xì)的podspec文件寫(xiě)法押袍,可以看這篇文章:Podspec語(yǔ)法參考 v1.2.0.beta.1
關(guān)于資源文件更詳細(xì)的寫(xiě)法,可以看這篇文章:給 Pod 添加資源文件

3.如何實(shí)現(xiàn)目錄分層

使用subspec來(lái)實(shí)現(xiàn)目錄分層凯肋。
目錄分層的好處:

  • 目錄分層谊惭,結(jié)構(gòu)清晰;
  • 使用pod引入一個(gè)三方庫(kù)時(shí)侮东,可以只引入一個(gè)subspec而不用將整個(gè)三方庫(kù)引入圈盔。

例如AFNetworking:

下面舉例說(shuō)明,如圖所示的目錄結(jié)構(gòu):

ZCPKit
┗━━━━Classes
     ┗━━━━ZCPKit.h
     ┗━━━━ZCPRouter
          ┗━━━━ZCPRouter.h
          ┗━━━━ZCPRouter.m
     ┗━━━━ZCPUtil
          ┗━━━━ZCPUtil.h
          ┗━━━━ZCPUtil.m

寫(xiě)法如下:

效果:

如果想有多層的目錄結(jié)構(gòu)還可以繼續(xù)嵌套下去悄雅。

有幾個(gè)需要注意的地方:

1.層級(jí)不能出現(xiàn)循環(huán)依賴驱敲。

  • 比如類ZCPUtil.h中 #import "ZCPRouter.h",同時(shí)ZCPRouter.h中 #import "ZCPUtil.h"宽闲。這樣當(dāng)寫(xiě)podspec時(shí)就需要在Util層級(jí)中寫(xiě)dependency 'ZCPKit/Router'众眨,在Router層級(jí)中寫(xiě)dependency 'ZCPKit/Util'握牧。如此便存在Router與Util層級(jí)之間的循環(huán)依賴。出現(xiàn)循環(huán)依賴時(shí)娩梨,三方庫(kù)是無(wú)法成功提交到repo上的沿腰,會(huì)報(bào)依賴錯(cuò)誤。解決辦法是狈定,層級(jí)間要盡量解耦颂龙。

2.分層的層級(jí)不要太多,層級(jí)不要太深掸冤。

  • 為了避免出現(xiàn)上述的循環(huán)依賴錯(cuò)誤厘托。

3.source_files使用的是真實(shí)的物理路徑,而dependency依賴其他層級(jí)時(shí)使用的是層級(jí)路徑稿湿,不是真實(shí)的物理路徑

  • 例如:ZCPUtil.h文件的真實(shí)路徑是:ZCPKit/Framework/Util,而Util層級(jí)是屬于ZCPKit層級(jí)下的一個(gè)子subspec押赊,所以當(dāng)寫(xiě)Router層級(jí)依賴Util層級(jí)時(shí)要寫(xiě):dependency 'ZCPKit/Util'而不是dependency 'ZCPKit/Framework/Util'

4.如何校驗(yàn)podspec文件

在podspec寫(xiě)好之后我們需要驗(yàn)證一下編寫(xiě)的內(nèi)容是否有誤饺藤。可以在命令行的三方庫(kù)當(dāng)前路徑下使用下面的命令:

pod lib lint (從本地驗(yàn)證你的pod能否通過(guò)驗(yàn)證)
pod spec lint (從本地和遠(yuǎn)程驗(yàn)證你的pod能否通過(guò)驗(yàn)證)

pod lib lint --verbose (加--verbose可以顯示詳細(xì)的檢測(cè)過(guò)程流礁,出錯(cuò)時(shí)會(huì)顯示詳細(xì)的錯(cuò)誤信息)
pod lib lint --allow-warnings (允許警告涕俗,用來(lái)解決由于代碼中存在警告導(dǎo)致不能通過(guò)校驗(yàn)的問(wèn)題)
pod lib lint --help (查看所有可選參數(shù),可選參數(shù)可以加多個(gè))

我們目前只是在本地寫(xiě)的三方庫(kù)神帅,所以只需要使用pod lib lint驗(yàn)證即可(這個(gè)過(guò)程會(huì)較為費(fèi)時(shí)再姑,需要稍微等待)。

我自己加了個(gè)循環(huán)依賴的錯(cuò)誤然后再重新檢測(cè)一下試試找御,可以看到檢測(cè)到了錯(cuò)誤(發(fā)現(xiàn)有錯(cuò)誤的時(shí)候元镀,建議用加--verbose的命令看詳細(xì)錯(cuò)誤信息):

需要注意的:
在檢測(cè)的時(shí)候會(huì)很經(jīng)常會(huì)出現(xiàn)各種亂七八糟的錯(cuò)誤,在文件多的情況下不太容易一次通過(guò)霎桅,并且即使你的代碼在Xcode中編譯通過(guò)了栖疑,但是也還是會(huì)出現(xiàn)很多錯(cuò)誤。所以你需要盡量去注意下面的幾個(gè)問(wèn)題:

1.當(dāng)代碼中存在警告時(shí)要記得使用--allow-warnings參數(shù)滔驶。

2.如果引入的文件或分好的層級(jí)需要依賴系統(tǒng)庫(kù)或三方庫(kù)遇革,要記得使用上面介紹的libararies,frameworks等屬性揭糕。

3.如果你的三方庫(kù)是在一個(gè)xcode項(xiàng)目中編寫(xiě)調(diào)試萝快,那么盡量不要用pch。

  • 因?yàn)楹芏囝愔g的小依賴會(huì)被pch給遮掩過(guò)去著角,這會(huì)導(dǎo)致在校驗(yàn)時(shí)出現(xiàn)大量錯(cuò)誤揪漩。

4.如果想要分層,那么盡量解耦使模塊能夠單獨(dú)存在雇寇。

  • 原因是當(dāng)分層較多層級(jí)較深時(shí)氢拥,很可能產(chǎn)生循環(huán)依賴的問(wèn)題蚌铜。

5.其他

如果想要了解一些實(shí)實(shí)在在的例子,你可以把別人的三方庫(kù)下載下來(lái)嫩海,podspec文件一般會(huì)跟其放在一起冬殃,這樣就能參考別人的podspec文件是怎么寫(xiě)的。比如AFNetworking:

1>用pod搜索AFNetworking

2>進(jìn)入AFNetworking的源碼地址

3>下載并查看

6.補(bǔ)充 校驗(yàn)時(shí)出現(xiàn)的一些問(wèn)題

1.不支持i386編譯的庫(kù)無(wú)法通過(guò)pod lib lint的問(wèn)題()
解決pod lib lint/repo push不支持i386編譯&只能真機(jī)運(yùn)行的庫(kù)

https://github.com/CocoaPods/...

2.在A私有庫(kù)中引入了B私有庫(kù)叁怪,導(dǎo)致pod lib lint不通過(guò)的問(wèn)題

在調(diào)用命令時(shí)需要添加B私有庫(kù)所在的repo源地址审葬。

pod lib lint <文件名>.podspec --sources='<私有庫(kù)所在repo的source>,https://github.com/CocoaPods/Specs.git' 

3.報(bào)錯(cuò) ··· error: include of non-modular header inside framework module ··· [-Werror,-Wnon-modular-include-in-framework-module]

解決辦法:在pod lib lint 或者 pod spec lint 以及 pod repo push ....時(shí)候加上 --use-libraries

參考:COCOAPODS創(chuàng)建私有PODS


后續(xù)

Cocoapods整理(一)——安裝Cocoapods
Cocoapods整理(二)——使用Cocoapods
Cocoapods整理(四)——搭建Cocoapods私有庫(kù)環(huán)境

本篇文章的私有庫(kù)demo:ZCPKit

個(gè)人的repo:zcprepo
私有庫(kù):ZCPKit


參考文章

給 Pod 添加資源文件
解決pod lib lint/repo push不支持i386編譯&只能真機(jī)運(yùn)行的庫(kù)
Podspec語(yǔ)法參考 v1.2.0.beta.1


iosgitobjective-cswift

閱讀 23.4k更新于 2 月 22 日

贊9收藏8

本作品系原創(chuàng),采用《署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際》許可協(xié)議


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奕谭,一起剝皮案震驚了整個(gè)濱河市涣觉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌血柳,老刑警劉巖官册,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異难捌,居然都是意外死亡膝宁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)根吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)员淫,“玉大人,你說(shuō)我怎么就攤上這事击敌〗榉担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵沃斤,是天一觀的道長(zhǎng)圣蝎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)轰枝,這世上最難降的妖魔是什么捅彻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鞍陨,結(jié)果婚禮上步淹,老公的妹妹穿的比我還像新娘。我一直安慰自己诚撵,他們只是感情好缭裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著寿烟,像睡著了一般澈驼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筛武,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天缝其,我揣著相機(jī)與錄音挎塌,去河邊找鬼。 笑死内边,一個(gè)胖子當(dāng)著我的面吹牛榴都,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漠其,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘴高,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了和屎?” 一聲冷哼從身側(cè)響起拴驮,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柴信,沒(méi)想到半個(gè)月后套啤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颠印,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纲岭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线罕。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窃判,靈堂內(nèi)的尸體忽然破棺而出钞楼,到底是詐尸還是另有隱情,我是刑警寧澤袄琳,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布询件,位于F島的核電站,受9級(jí)特大地震影響唆樊,放射性物質(zhì)發(fā)生泄漏宛琅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一逗旁、第九天 我趴在偏房一處隱蔽的房頂上張望嘿辟。 院中可真熱鬧,春花似錦片效、人聲如沸红伦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昙读。三九已至,卻和暖如春膨桥,著一層夾襖步出監(jiān)牢的瞬間蛮浑,已是汗流浹背唠叛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沮稚,地道東北人艺沼。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像壮虫,于是被迫代替她去往敵國(guó)和親澳厢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容