CocoaPods建立自己的Podspec(三)

創(chuàng)建自己的 Pod 十分簡(jiǎn)單。只需要?jiǎng)?chuàng)建 .podspec,編輯好 .podspec 的必要信息儿礼,提交到 Git,然后就可以在其他項(xiàng)目中使用了宫静。

如果想了解其中的原理,可以查看這篇文章扔字。

如果是 Swift 囊嘉,可以在此基礎(chǔ)上參考這篇文章。

創(chuàng)建.podspec

首先在你的項(xiàng)目中使用如下命令創(chuàng)建名為 LPPushService 的 LPPushService.podspec(當(dāng)然你也可以使用vim創(chuàng)建革为,只是沒有默認(rèn)文本而已)

$ pod spec create LPPushService

編輯.podspec

創(chuàng)建好的 .podspec 包含大量的注釋說明了每個(gè)參數(shù)的含義及用法扭粱。如果想詳細(xì)了解可以仔細(xì)閱讀。這里只介紹幾個(gè)常用的震檩。

Pod::Spec.new do |s|

  s.name                = "LPPushService"
  s.version             = "1.0.0"
  s.summary             = "integrate APNs rapidly"
  s.homepage            = "https://github.com/xiaofei86/LPPushService"
  s.license             = { :type => "MIT", :file => "LICENSE" }
  s.author             = { "XuYafei" => "xuyafei86@163.com" }
  s.social_media_url   = "http://xuyafei.cn"
  s.platform            = :ios, "7.0"
  s.source              = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version }
  s.source_files        = "LPPushService/**/*.{h,m}"
  s.resources          = "LPPushService/Images/*.png"
  s.dependency          "BPushSDK", "1.4.1"
  s.requires_arc        = true

end

s.name:名稱琢蛤,pod search 搜索的關(guān)鍵詞
s.version:版本
s.summary:簡(jiǎn)介蜓堕,pod search 搜索的關(guān)鍵詞
s.homepage:主頁地址,例如Github地址
s.license:許可證
s.author:作者
s.social_media_url:社交網(wǎng)址
s.platform:平臺(tái)
s.source:Git倉庫地址博其,例如在Github地址后邊加上 .git 就是Git倉庫地址套才,常見寫法如下
s.source_files:需要包含的源文件,常見的寫法如下
s.resources:需要包含的圖片等資源文件
s.dependency:依賴庫慕淡,不能依賴未發(fā)布的庫
s.dependency:依賴庫背伴,如有多個(gè)可以這樣寫
s.requires_arc:是否要求ARC

s.source_files 常見寫法

"Directory1/*"
"Directory1/Directory2/*.{h,m}"
"Directory1/**/*.h"
  • “*” 表示匹配所有文件
  • “*.{h,m}” 表示匹配所有以.h和.m結(jié)尾的文件
  • “**” 表示匹配所有子目錄

s.source 常見寫法

s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :commit => "68defea" }
s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => 1.0.0 }
s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version }
  • commit => "68defea" 表示將這個(gè)Pod版本與Git倉庫中某個(gè)commit綁定
  • tag => 1.0.0 表示將這個(gè)Pod版本與Git倉庫中某個(gè)版本的comit綁定
  • tag => s.version 表示將這個(gè)Pod版本與Git倉庫中相同版本的comit綁定

按照上述規(guī)則編輯完成就制作好了 .podspec(最好使用vim進(jìn)行編輯)。

上傳到Git

將包含配置好的 .podspec 的項(xiàng)目提交 Git峰髓,并給這次提交打上 tag傻寂,這時(shí)就可以在其他項(xiàng)目中使用 CocoaPods 引入你配置好的 Pod 了。

pod 'LPPushService', :git => 'https://github.com/xiaofei86/LPPushService.git', :tag => '1.0.0'

當(dāng)然携兵,在給其他項(xiàng)目使用前最好先<a href="##驗(yàn)證.podspec">驗(yàn)證.podspec</a>的有效性疾掰。

*驗(yàn)證.podspec

編輯好后最好先驗(yàn)證 .podspec 是否有有效

$ pod spec lint LPPushService.podspec

驗(yàn)證過程中:

 -> LPPushService

驗(yàn)證成功后:

LPPushService.podspec passed validation.

驗(yàn)證失敗后:

[!] The spec did not pass validation, due to 1 error.

驗(yàn)證 .podspec 會(huì)先測(cè)試本地 .podspec 文件是否存在語法錯(cuò)誤。測(cè)試成功再根據(jù) .podspec 文件找到遠(yuǎn)端倉庫對(duì)應(yīng)的版本克隆到本地并進(jìn)行配置徐紧。最后測(cè)試文件是否能夠編譯成功静檬。

*.podspec驗(yàn)證失敗錯(cuò)誤排查

語法錯(cuò)誤

如果是因?yàn)檎Z法錯(cuò)誤,驗(yàn)證失敗后會(huì)給出錯(cuò)誤的準(zhǔn)確定位

[!] Invalid `LPPushService.podspec` file: no .<digit> floating literal anymore; put 0 before dot
  s.version      = “1.0.0”
                        ^
LPPushService.podspec:5: syntax error, unexpected tFLOAT, expecting '('
  s.version      = “1.0.0”
                           ^

標(biāo)記“^”的地方即為有語法錯(cuò)誤的地方并级。

上述錯(cuò)誤是因?yàn)槭褂谩拔谋揪庉嫛边M(jìn)行編輯造成的拂檩。使用文本編輯有時(shí)候英文""引號(hào)會(huì)自動(dòng)變成中文“”引號(hào)。

[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.

使用 vim 將其改為英文的""引號(hào)即可嘲碧。

依賴錯(cuò)誤

但是广恢,有些非語法錯(cuò)誤是不會(huì)給出錯(cuò)誤原因的。這個(gè)時(shí)候可以使用“--verbose”來查看詳細(xì)的驗(yàn)證過程來幫助定位錯(cuò)誤呀潭。

pod spec lint LPPushService.podspec --verbose

如下錯(cuò)誤通過 --verbose 就可以找到原因。

 -> LPPushService (1.0.0)
    - ERROR | [iOS] Encountered an unknown error (The 'Pods' target has transitive dependencies that include static binaries: (/private/var/folders/jz/b_m3k7ln47524cm__h3__mk00000gn/T/CocoaPods/Lint/Pods/BPushSDK/LibBPush/libBPush.a)) during validation.

這個(gè)錯(cuò)誤是因?yàn)橐蕾噹欤╯.dependency)包含了.a靜態(tài)庫造成的至非。雖然這并不影響Pod的使用钠署,但是驗(yàn)證是無法通過的』耐郑可以通過 --use-libraries 來讓驗(yàn)證通過谐鼎。

pod spec lint LPPushService.podspec --verbose --use-libraries

這種情況下使用 --use-libraries 雖然不會(huì)出現(xiàn)錯(cuò)誤(error),但是有時(shí)候會(huì)帶來一些警告(waring)趣惠,警告同樣是無法通過驗(yàn)證的狸棍。這時(shí)可以用 --allow-warnings 來允許警告。

pod spec lint LPPushService.podspec --verbose --use-libraries --allow-warnings

安裝錯(cuò)誤

如果在其他項(xiàng)目 pod install 的過程中味悄,出現(xiàn)包含“undefined method `end_with?' for nil”字樣的報(bào)錯(cuò)草戈。進(jìn)入“~/.cocoapods/repos”目錄,刪除“master”侍瑟,并將 master-1 改為 master 即可唐片。

如果出現(xiàn)如下錯(cuò)誤丙猬,而你的驗(yàn)證可以通過,那么一般更新下版本號(hào)就可以解決费韭。

[!] Unable to find a specification for 'LPPushService'.

再次驗(yàn)證

如果錯(cuò)誤發(fā)生在 .podspec 中茧球。當(dāng)修改完時(shí),不需要再次提交就可以直接驗(yàn)證星持。如果錯(cuò)誤發(fā)生在代碼中抢埋,則需要再次提交才能驗(yàn)證。

發(fā)布到CocoaPods

你可以用 .podspec 文件來方便的管理內(nèi)部代碼督暂,當(dāng)然揪垄,也可以發(fā)布自己的 Pod 供其他開發(fā)者使用。

CocoaPods 0.33中加入了 Trunk 服務(wù)损痰,使用 Trunk 服務(wù)可以方便的發(fā)布自己的Pod福侈。雖然一開始使用 GitHub Pull Requests 來整理所有公共 pods 效果很好。但是卢未,隨著 Pod 數(shù)量的增加肪凛,這個(gè)工作對(duì)于 spec 維護(hù)人員 Keith Smiley 來說變得十分繁雜。甚至一些沒有通過 $ pod lint 的 spec 也被提交上來辽社,造成 repo 無法 build伟墙。CocoaPods Trunk 服務(wù)的引入,解決了很多類似的問題滴铅。每次使用 Trunk 服務(wù)發(fā)布 Pod 時(shí)都會(huì)通過 $ pod lint 驗(yàn)證 .podspec 是否有效戳葵。要想使用 Trunk 服務(wù),首先需要使用如下命令注冊(cè)自己的電腦汉匙。這很簡(jiǎn)單拱烁,只要你指明你的郵箱地址(spec文件中的)和名稱即可。CocoaPods 會(huì)給你填寫的郵箱發(fā)送驗(yàn)證郵件噩翠,點(diǎn)擊郵件中的鏈接就可通過驗(yàn)證戏自。

pod trunk register xuyafei86@163.com "XuYafei"

然后就可以發(fā)布你的 Pod 了。

pod trunk push LPPushService.podspec

發(fā)布時(shí)會(huì)驗(yàn)證 Pod 的有效性伤锚,如果你在手動(dòng)驗(yàn)證 Pod 時(shí)使用了 --use-libraries 或 --allow-warnings 等修飾符擅笔,那么發(fā)布的時(shí)候也應(yīng)該使用相同的字段修飾,否則出現(xiàn)相同的報(bào)錯(cuò)屯援。

pod trunk push LPPushService.podspec --use-libraries --allow-warnings

發(fā)布成功后猛们,就可以使用 pod search 搜索到你的 Pod 了!

-> LPPushService (1.0.0)
   integrate APNs rapidly
   pod 'LPPushService', '~> 1.0.0'
   - Homepage: https://github.com/xiaofei86/LPPushService
   - Source:   https://github.com/xiaofei86/LPPushService.git
   - Versions: 1.0.0 [master repo]

由于 pod search 是搜索的本地“~/.cocoapods”狞洋,所以在其他設(shè)備上可能無法搜到弯淘。這時(shí)只需要執(zhí)行 pod install 更新下 pod 倉庫即可(不要加 --no-repo-update)。

版本升級(jí)

當(dāng)需要更新 Pod 版本的時(shí)候吉懊,修改 .podspec 中的 s.version 為更高的版本號(hào)耳胎,并修改 s.source 中對(duì)應(yīng)的 Git 版本惯吕。提交到Git,并打上對(duì)應(yīng)tag怕午。然后再次執(zhí)行pod trunk push LPPushService.podspec將新的 .podspec 發(fā)布到 CocoaPods废登。更新完成!

為了更新更加方便郁惜,版本控制更加清晰堡距,s.source 建議采用如下寫法:

s.source = { :git => "https://github.com/xiaofei86/LPPushService.git", :tag => s.version }

這樣寫將 Git 的版本與 CocoaPods 的版本進(jìn)行了綁定。每次提交后再給本次提交打上 tag 就完成了更新兆蕉。而且在 Git 中就可以清晰的看到哪次提交對(duì)應(yīng)的哪個(gè) CocoaPods 版本羽戒。如果與 commit 綁定,則要通過兩次提交才能完成更新虎韵,第一次先提交修改代碼易稠,第二次將上一次 commit id 更新到 s.source 然后再次提交。如果直接與固定 tag 綁定包蓝,則每次還都要修改 s.source驶社。如果你的 Pod 是私有庫,那么 s.source 其實(shí)是無用的测萎。因?yàn)樵?Podfile 中已經(jīng)指明了地址和版本(如下)亡电。這時(shí) s.source 可以隨便填寫,但最好還是按照上述規(guī)則以便以后發(fā)布硅瞧。

pod 'LPPushService', :git => 'https://github.com/xiaofei86/LPPushService.git', :tag => 1.0.0

博客:xuyafei.cn
簡(jiǎn)書:jianshu.com/users/2555924d8c6e
微博:weibo.com/xuyafei86
Github:github.com/xiaofei86

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末份乒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腕唧,更是在濱河造成了極大的恐慌或辖,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枣接,死亡現(xiàn)場(chǎng)離奇詭異孝凌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)月腋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓣赂,“玉大人榆骚,你說我怎么就攤上這事』图” “怎么了妓肢?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苫纤。 經(jīng)常有香客問我碉钠,道長纲缓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任喊废,我火速辦了婚禮祝高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘污筷。我一直安慰自己工闺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布瓣蛀。 她就那樣靜靜地躺著陆蟆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惋增。 梳的紋絲不亂的頭發(fā)上叠殷,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音诈皿,去河邊找鬼林束。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纫塌,可吹牛的內(nèi)容都是我干的诊县。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼措左,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼依痊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怎披,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤胸嘁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凉逛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體性宏,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年状飞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毫胜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诬辈,死狀恐怖酵使,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焙糟,我是刑警寧澤口渔,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站穿撮,受9級(jí)特大地震影響缺脉,放射性物質(zhì)發(fā)生泄漏痪欲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一攻礼、第九天 我趴在偏房一處隱蔽的房頂上張望业踢。 院中可真熱鬧,春花似錦秘蛔、人聲如沸陨亡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负蠕。三九已至,卻和暖如春倦畅,著一層夾襖步出監(jiān)牢的瞬間遮糖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工叠赐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲账,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓芭概,卻偏偏與公主長得像赛不,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢洲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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