網(wǎng)上將自己的項目做成Pod 的文檔很多间景,但是有些文檔已經(jīng)很老了祭往,不適合新手上手晦嵌,經(jīng)過這兩天的研究我決定還是自己寫一篇這方面的文檔:
整個過程的實現(xiàn)我以一個基于AFNetworking封裝的網(wǎng)絡(luò)請求OBDataService為例:
一佩伤、創(chuàng)建自己的github倉庫
cocopods都托管在GitHub上(官方鏈接:https://github.com/CocoaPods)冻记,所有的Pods依賴庫也都依賴github搏熄,因此第一步我們需要創(chuàng)建一個屬于自己的github倉庫棚唆。倉庫創(chuàng)建界面如下圖:
上圖中標了序號的共6處暇赤,對應的說明如下:
1、Repository name
倉庫名稱宵凌,這里寫成OBDataService鞋囊,必填的.因為我之前創(chuàng)建過這個文件所以才會提示已經(jīng)創(chuàng)建了;
2瞎惫、Description
倉庫的描述信息溜腐,可選的;
3瓜喇、倉庫的公開性
這里只能選Public挺益,一個是因為Private是要money的,再一個Private別人看不到還共享個毛乘寒;
4望众、是否創(chuàng)建一個默認的README文件
一個完整地倉庫,都需要README說明文檔伞辛,建議選上烂翰。當然不嫌麻煩的話你也可以后面再手動創(chuàng)建一個;
5始锚、是否添加.gitignore文件
.gitignore文件里面記錄了若干中文件類型刽酱,凡是該文件包含的文件類型,git都不會將其納入到版本管理中瞧捌。是否選擇看個人需要棵里;
6、license類型
正規(guī)的倉庫都應該有一個license文件姐呐,Pods依賴庫對這個文件的要求更嚴殿怜,是必須要有的。因此最好在這里讓github創(chuàng)建一個曙砂,也可以自己后續(xù)再創(chuàng)建头谜。我使用的license類型是MIT。
上面的各項都填寫完畢后鸠澈,點擊Create repository按鈕即可柱告,到這,倉庫創(chuàng)建過程就結(jié)束了笑陈。
二际度、clone倉庫到本地
為了便于向倉庫中刪減內(nèi)容,需要先將倉庫clone到本地涵妥,操作方式有多種乖菱,推薦使用命令行:
$ git clone https://github.com/obally/OBDataService.git
操作完成后,github上對應的文件都會拷貝到本地,目錄結(jié)構(gòu)為:
后續(xù)我們的所有文件增窒所、刪鹉勒、改都在這個目錄下進行。
2吵取、LICENSE文件
CocoaPods強制要求所有的Pods依賴庫都必須有l(wèi)icense文件禽额,否則驗證不會通過。license的類型有很多種海渊,詳情可以參考網(wǎng)站tl;dr Legal绵疲。在創(chuàng)建github倉庫的時候,我已經(jīng)選擇了MIT類型的license臣疑。
3盔憨、主類文件
創(chuàng)建Pods依賴庫就是為了方便別人使用我們的成果,比如我想共享給大家的OBDataService類讯沈,是我想提供給廣大用戶使用的郁岩,這個類自然是必不可少的。我把這個類包含的兩個文件放到一個名稱為OBDataService的文件夾中缺狠,對應的目錄結(jié)構(gòu)如圖:
里面包含兩個文件:OBDataService.h和OBDataService.m
4问慎、demo工程
為了快速地教會別人使用我們的Pods依賴庫,通常需要提供一個demo工程挤茄。我創(chuàng)建的demo工程放到了一個名為OBDataServiceDemo的文件夾中如叼,該目錄包含的文件如下圖所示:
我用pod 引入了AFNetworking
5、README.md
使用github的人應該都熟悉這個文件穷劈,它是一個成功github倉庫必不可少的一部分笼恰,使用的是markdown標記語言,用于對倉庫的詳細說明歇终。
以上所說的5個是創(chuàng)建Pods依賴庫所需最基礎(chǔ)的文件社证,其中1、2评凝、3是必需的追葡,4、5是可選但強烈推薦創(chuàng)建的奕短。
添加完這些文件以后宜肉,我的github本地倉庫目錄就變成了下圖所示的樣子:
三、向本地git倉庫中添加創(chuàng)建Pods依賴庫所需文件
注意:以下描述的文件都要放在步驟二clone到本地的git倉庫的根目錄下面翎碑。
創(chuàng)建.podspec
首先在你的項目中使用如下命令創(chuàng)建名為 OBDataService 的 OBDataService.podspec(當然你也可以使用vim創(chuàng)建谬返,只是沒有默認文本而已)
$ pod spec create OBDataService
編輯.podspec
創(chuàng)建好的 .podspec 包含大量的注釋說明了每個參數(shù)的含義及用法。如果想詳細了解可以仔細閱讀杈女。這里只介紹幾個常用的。
1、后綴為.podspec文件
該文件為Pods依賴庫的描述文件达椰,每個Pods依賴庫必須有且僅有那么一個描述文件翰蠢。文件名稱要和我們想創(chuàng)建的依賴庫名稱保持一致,我的OBDataService依賴庫對應的文件名為OBDataService.podspec啰劲。
1.1 podspec文件內(nèi)容
OBDataService.podspec的保存內(nèi)容為:
Pod::Spec.new do |s|
s.name? ? ? ? = "OBDataService"
s.version? ? ? = "1.0.0"
s.summary? ? ? = "A tool for URL Request"
s.description? = <<-DESC
A tool for URL Request base on AFNetworking
DESC
s.homepage? ? = "https://github.com/obally/OBDataService.git"
s.license? ? ? = "MIT"
s.author? ? ? ? ? ? = { "obally" => "*********@qq.com" }
s.platform? ? = :ios, "7.0"
s.source? ? ? = { :git => "https://github.com/obally/OBDataService.git", :tag => "#{s.version}" }
s.source_files? =? "OBDataService/*.{h,m}"
s.dependency "AFNetworking", "~> 3.1.0"
end
其中需要說明的又幾個參數(shù):
s.name:名稱梁沧,pod search 搜索的關(guān)鍵詞
s.version:版本
s.summary:簡介,pod search 搜索的關(guān)鍵詞
s.homepage:主頁地址蝇裤,例如Github地址
s.license:許可證
s.author:作者
s.social_media_url:社交網(wǎng)址
s.platform:平臺
s.source:Git倉庫地址廷支,例如在Github地址后邊加上 .git 就是Git倉庫地址,常見寫法如下
s.source_files:需要包含的源文件栓辜,常見的寫法如下
s.resources:需要包含的圖片等資源文件
s.dependency:依賴庫恋拍,不能依賴未發(fā)布的庫
s.dependency:依賴庫,如有多個可以這樣寫
s.requires_arc:是否要求ARC
s.source_files 常見寫法
"Directory1/*"? 表示匹配所有文件
"Directory1/Directory2/*.{h,m}"? 表示匹配所有以.h和.m結(jié)尾的文件
"Directory1/**/*.h"? 表示匹配所有子目錄
s.source 常見寫法
s.source = { :git => "https://github.com/obally/OBDataService.git", :commit => "68defea" }
s.source = { :git => "https://github.com//obally/OBDataService.git", :tag => 1.0.0 }
s.source = { :git => "https://github.com//obally/OBDataService.git", :tag => s.version }
commit => "68defea" 表示將這個Pod版本與Git倉庫中某個commit綁定
tag => 1.0.0 表示將這個Pod版本與Git倉庫中某個版本的comit綁定
tag => s.version 表示將這個Pod版本與Git倉庫中相同版本的comit綁定
按照上述規(guī)則編輯完成就制作好了 .podspec(最好使用vim進行編輯)藕甩。
驗證.podspec
執(zhí)行以下命令施敢,為 Pod 添加版本號,并打上 tag:
set the new version to 1.0.0
set the new tag to 1.0.0
編輯好后最好先驗證 .podspec 是否有有效
$ pod spec lint
驗證過程中:
-> OBDataService
驗證成功后:OBDataService.podspec passed validation.
驗證失敗后:[!] The spec did not pass validation, due to 1 error.
驗證 .podspec 會先測試本地 .podspec 文件是否存在語法錯誤狭莱。測試成功再根據(jù) .podspec 文件找到遠端倉庫對應的版本克隆到本地并進行配置僵娃。最后測試文件是否能夠編譯成功。
.podspec驗證失敗錯誤排查
語法錯誤
如果是因為語法錯誤腋妙,驗證失敗后會給出錯誤的準確定位
[!] Invalid `OBDataService.podspec` file: no .floating literal anymore; put 0 before dot
s.version = “1.0.0”
^
OBDataService.podspec:5: syntax error, unexpected tFLOAT, expecting '('
s.version = “1.0.0”
^
標記“^”的地方即為有語法錯誤的地方。
上述錯誤是因為使用“文本編輯”進行編輯造成的匙睹。使用文本編輯有時候英文""引號會自動變成中文“”引號谆甜。
[!] 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 將其改為英文的""引號即可垃僚。
依賴錯誤
但是,有些非語法錯誤是不會給出錯誤原因的规辱。這個時候可以使用“--verbose”來查看詳細的驗證過程來幫助定位錯誤。
pod spec lint OBDataService.podspec --verbose
如下錯誤通過 --verbose 就可以找到原因改淑。
-> OBDataService(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.
這個錯誤是因為依賴庫(s.dependency)包含了.a靜態(tài)庫造成的。雖然這并不影響Pod的使用浴讯,但是驗證是無法通過的朵夏。可以通過 --use-libraries 來讓驗證通過仰猖。
pod spec lint OBDataService.podspec --verbose --use-libraries
這種情況下使用 --use-libraries 雖然不會出現(xiàn)錯誤(error),但是有時候會帶來一些警告(waring)鸵赫,警告同樣是無法通過驗證的躏升。這時可以用 --allow-warnings 來允許警告。
pod spec lint OBDataService.podspec --verbose --use-libraries --allow-warnings
安裝錯誤
如果在其他項目 pod install 的過程中膨疏,出現(xiàn)包含“undefined method end_with?' for nil”字樣的報錯。進入“~/.cocoapods/repos”目錄者吁,刪除“master”双霍,并將 master-1 改為 master 即可。
如果出現(xiàn)如下錯誤染坯,而你的驗證可以通過丘逸,那么一般更新下版本號就可以解決。[!] Unable to find a specification for 'OBDataService'.`
再次驗證
如果錯誤發(fā)生在 .podspec 中仲锄。當修改完時湃鹊,不需要再次提交就可以直接驗證。如果錯誤發(fā)生在代碼中怀愧,則需要再次提交才能驗證余赢。
上傳到Git
將包含配置好的 .podspec 的項目提交 Git,并給這次提交打上 tag
$ git add -A && git commit -m "Release 1.0.0."
$ git tag '1.0.0'
$ git push --tags
$ git push origin master
發(fā)布到CocoaPods
你可以用 .podspec 文件來方便的管理內(nèi)部代碼扛拨,當然绑警,也可以發(fā)布自己的 Pod 供其他開發(fā)者使用。
CocoaPods 0.33中加入了 Trunk 服務(wù)计盒,使用 Trunk 服務(wù)可以方便的發(fā)布自己的Pod章郁。雖然一開始使用 GitHub Pull Requests 來整理所有公共 pods 效果很好志衍。但是,隨著 Pod 數(shù)量的增加培廓,這個工作對于 spec 維護人員 Keith Smiley 來說變得十分繁雜春叫。甚至一些沒有通過 $ pod lint 的 spec 也被提交上來,造成 repo 無法 build价匠。CocoaPods Trunk 服務(wù)的引入呛每,解決了很多類似的問題。每次使用 Trunk 服務(wù)發(fā)布 Pod 時都會通過 $ pod lint 驗證 .podspec 是否有效洋腮。要想使用 Trunk 服務(wù)手形,首先需要使用如下命令注冊自己的電腦。這很簡單伙狐,只要你指明你的郵箱地址(spec文件中的)和名稱即可曼玩。CocoaPods 會給你填寫的郵箱發(fā)送驗證郵件黍判,點擊郵件中的鏈接就可通過驗證。
pod trunk register *********@qq.com "obally"
然后就可以發(fā)布你的 Pod 了顷帖。
pod trunk push OBDataService.podspec
發(fā)布時會驗證 Pod 的有效性,如果你在手動驗證 Pod 時使用了 --use-libraries 或 --allow-warnings 等修飾符榴嗅,那么發(fā)布的時候也應該使用相同的字段修飾嗽测,否則出現(xiàn)相同的報錯。
pod trunk push OBDataService.podspec --use-libraries --allow-warnings
發(fā)布成功后唠粥,就可以使用 pod search 搜索到你的 Pod 了晤愧!
由于 pod search 是搜索的本地“~/.cocoapods”,所以在其他設(shè)備上可能無法搜到只厘。這時只需要執(zhí)行 pod install 更新下 pod 倉庫即可(不要加 --no-repo-update)舅巷。
版本升級
當需要更新 Pod 版本的時候,修改 .podspec 中的 s.version 為更高的版本號介评,并修改 s.source 中對應的 Git 版本爬舰。提交到Git,并打上對應tag坪仇。然后再次執(zhí)行pod trunk push HTQRCode.podspec.當修改了項目內(nèi)容垃你,重新提交,修改tag,一定要記得修改.podspec 中的s.version?
將新的 .podspec 發(fā)布到 CocoaPods皆刺。更新完成凌摄!
為了更新更加方便锨亏,版本控制更加清晰忙干,s.source 建議采用如下寫法:
s.source = { :git => "https://github.com/obally/OBDataService.git", :tag => s.version }
這樣寫將 Git 的版本與 CocoaPods 的版本進行了綁定浪藻。每次提交后再給本次提交打上 tag 就完成了更新爱葵。而且在 Git 中就可以清晰的看到哪次提交對應的哪個 CocoaPods 版本。如果與 commit 綁定萌丈,則要通過兩次提交才能完成更新浓瞪,第一次先提交修改代碼巧婶,第二次將上一次 commit id 更新到 s.source 然后再次提交。如果直接與固定 tag 綁定英岭,則每次還都要修改 s.source湿右。如果你的 Pod 是私有庫,那么 s.source 其實是無用的吭狡。因為在 Podfile 中已經(jīng)指明了地址和版本(如下)丈莺。這時 s.source 可以隨便填寫缔俄,但最好還是按照上述規(guī)則以便以后發(fā)布。
協(xié)同工作
當需要其他人來共同維護你的代碼,需要提供權(quán)限
pod trunk add-owner OBDataService *******@163.com
總結(jié)制作pod的步驟
1.從自己的github上創(chuàng)建項目,clone到本地
git clone https://github.com/obally/OBDataService.git
2.創(chuàng)建創(chuàng)建podspec文件和相對應的項目
Pod::Spec.new do |s|
s.name? ? ? ? = "OBDataService"
s.version? ? ? = "1.0.2"
s.summary? ? ? = "A tool for URL Request"
s.description? = <<-DESC
A tool for URL Request base on AFNetworking
DESC
s.homepage? ? = "https://github.com/obally/OBDataService.git"
s.license? ? ? = "MIT"
s.author? ? ? ? ? ? = { "obally" => "*********@qq.com" }
s.platform? ? = :ios, "7.0"
s.source? ? ? = { :git => "https://github.com/obally/OBDataService.git", :tag => "#{s.version}" }
s.source_files? =? "OBDataService/*.{h,m}"
s.dependency "AFNetworking", "~> 3.1.0"
end
3.推送的遠程倉庫,校驗podspec文件
git add -A && git commit -m "Release 1.0.0."
git tag '1.0.0'
git push --tags
git push origin master
pod spec lint
4.使用trunk發(fā)布到CocoaPods(第一次需要register)
pod trunk register *********@qq.com "obally"
pod trunk push OBDataService.podspec
5.如需更改項目或者.podspec 文件 修改2中s.version 重復3步驟還有4中的第二步驟即可蟹略,記住s.version 必須與3中的tag 保持一致