想了想, 發現自己好久都沒有寫新的文章了, 還有一些朋友跑過來說我的掘金好久沒更新了, 其實不是的, 我一直在維護並更新玩轉iOS開發:自己造的輪子《CLUIKit》和玩轉iOS開發:自己造的輪子《CLFoundation》, 只是沒有文章的更新日期, 這個沒法看到我更新文章而已, 希望掘金考慮考慮加上個更新時間~~
請他喝杯星爸爸
如果您覺得挺讚的話, 可以我喝杯星爸爸, 謝謝啦~

這段時間除了忙著做專案之外, 還有一件事就是製作CocoaPods
庫, 這個東西雖然好用, 不研究還好, 一研究就會發現, 真的是.....

搞了一兩天, 搜了N
多個百度和谷歌, 也諮詢了很多大佬, 終於搗鼓出來了, 下面就直接上文章, 不那麼多廢話了.
建立podspec檔案
使用終端找到需要建立CocoaPods
開發庫的資料夾
cd Project資料夾
複製程式碼

找到對應的路徑後, 再輸入建立podspec
檔案的命令
pod spec create 庫名
複製程式碼

編輯podspec檔案
開啟庫名.podspec
檔案之後, 我們會看到很多對應的註釋, 按照個人喜歡, 選擇刪掉或者不刪掉, 這裡為了演示選擇刪掉全部註釋.

這裡解釋一下各個引數:
- name: 庫名, 必選
- version: 版本號, 必選
- summary: 庫的概要
- description: 庫的描述, 可選
- homepage: 庫的首頁, 可選
- license: 開源協議, 如有開源協議必選
- author: 作者, 必選, 詳情看文章後面的介紹
- platform: 設定最低支援的系統版本號, 可選
- source: 資源地址, 必選
- source_files: 資原始檔, 必選
- exclude_files: 排除檔案, 可選
- requires_arc: 是否是ARC, 可選
- frameworks: 需要關聯的系統Frameworks
- dependency: 需要關聯的第三方庫
更詳細的可以到CocoaPods網站去查詢
這裡我們舉個例子, CLUIKit.podspec的寫法, 這裡只依賴了三個庫, MJRefresh, CLFoundation和Masonry.

上面這種寫法比較適合單一的庫, 比如MJRefresh, CLFoundation和Masonry這型別的, 但如果我們需要拆分出幾個子模組讓開發者去選擇, 這裡有兩種方案:
- 開啟多一個
Git
倉庫, 分開來儲存 - 通過編寫
podspec
檔案的技巧拆分.
這裡我們推薦第二種方案.
編寫podspec檔案進階
這裡我們可以找到最經典的案例就是AFNetworking.podspec, 如果這個庫全都是我們自己寫的, 那麼可以參照著來寫:


但如果我們是要依賴於第三方的庫或者是Framework
, 那這裡可能就不適合了, 比如CLMapKit.podspec, 這裡依賴了GoogleMaps
, 並且未來可能還會相容其他的地相簿, 那麼我們就必須拆分成N
個子模組, 並且要針對來編寫:

- **subspec: **子模組的標籤, 名字可自定義
- static_framework: 靜態庫標籤, 表示我們依賴的
Framework
是靜態的.
這裡需要注意一點的就是source_files這個標籤, 在GoogleMap
這個子模組裡, 我們的寫法要根據我們的檔案層級來編寫, 比如CLMapKit這個庫的GoogleMap
模組, 它的層級就是CLMapKit/GoogleMap/CLGoogleMapViewController
, 最後才到要共享的檔案, 所以我們在這裡要寫成圖上鎖顯示的那樣.
並且針對GoogleMap
這個subspec
寫上所依賴的庫:
- dependency: GoogleMaps
如果我們這個庫裡面需要.Bundle
檔案, 那我們就需要加一個Resource標籤:
- resource: Classese/BundleName.bundle
驗證podspec檔案
當我們寫好了podspec
檔案之後, 我們就需要在本地驗證一下:
pod spec lint
複製程式碼

這個時候我們沒有看到有任何的error
資訊, 就已經ok
了, 如果我們不想要警告的話, 可以帶上--allow-warnings
這個關鍵詞.
釋出第三方庫
經過上面我們的編寫, 以及驗證podspec
檔案之後, 我們就可以準備釋出我們的庫了, 這裡我們只講解如何釋出開源的庫, 私有的暫時不去研究先.
建立公共的Git
倉庫
首先我們需要去建立一個Git
倉庫, 大多數老鐵選擇的是GitHub
, 怎麼建立, 怎麼clone
, 這裡就不解釋了, 我們把程式碼上傳上GitHub
之後會有一個醬紫的介面:

所有程式碼檔案及podspec
檔案上傳了之後, 我們就繼續下一步.
建立Git Tag
之前我們解釋過在podspec
有一個標籤叫做version
, 這個標籤是用來標註pod
庫的版本號, 這個版本號是不能重疊的, 這裡建議大家這個version
版本號和Git Tag
保持一致就好了.
在建立Git Tag
之前, 我們首先要去到我們Clone
下來的資料夾內, 然後利用命令建立, 建立Git Tag
的命令:
git tag 版本號
複製程式碼
建立完成後, 我們需要把這個Git Tag
推到GitHub
上, 這個時候我們需要用到Push
命令:
git push origin --tags
複製程式碼
切記, 在建立
Git Tag
之前一定要把所有操作都完成後再進行, 否則會造成Git Tag
於內容不同步 .
刪除Git Tag
如果我們需要刪掉本地的Git Tag
的話, 我們可以使用刪除命令:
git tag -d 版本號
複製程式碼
如果我們是需要刪除遠端倉庫裡的Git Tag
的話, 我們可以使用遠端刪除命令:
git push origin --delete 版本號
複製程式碼
這樣子我們就可以刪除掉遠端倉庫的Git Tag
了.
查詢Git Tag
如果我們需要查詢已有的本地Git Tag
, 那麼我們可以使用查詢命令:
git tag
複製程式碼

如果我們是需要查詢遠端倉庫的話, 我們可以使用查詢指定的分支去檢視:
git show origin
複製程式碼

暫時沒找到如何檢視遠端倉庫
Tag
的命令, 只能用上面的方式了.
註冊CocoaPods
釋出前的最後一個操作就是註冊CocoaPods
, 我們可以使用下面的命令去註冊:
pod trunk register 郵箱 '暱稱'
複製程式碼

做完這個操作只有, 你的郵箱會收到一封郵件, 我們開啟了那個連結之後, 如果網站顯示了一張圖, 上面寫著You can go back to your terminal new.
, 那我們就可以繼續下一步操作, 釋出我們的CocoaPods
庫了.

釋出CocoaPods
回到我們的庫首目錄(就是有.podspec檔案的那個目錄), 然後使用Trunk
命令:
pod trunk push
複製程式碼
如果我們在驗證的時候發現了有幾個Warnings
的話, 那我們就需要加上一個關鍵詞:
pod trunk push --allow-warnings
複製程式碼
如果我們還想看到詳細資訊的話, 我們還可以加上另一個關鍵詞:
pod trunk push --allow-warnings --verbose
複製程式碼
如果我們在檢測時發現了圖中的錯誤:

那我們就需要加上另一個關鍵詞:
pod trunk push --allow-warnings --use-libraries
複製程式碼
最後我們輸入完所有命令, 看到了圖中所示, 那就說明了我們的庫發推送成功了:

查詢已傳送的庫
當我們推送完庫之後直接去pod search ProjectName
, CocoaPods
會提示找不到, 原因是因為本地的CocoaPods search_index.json
檔案沒有更新到, 這個時候我們可以手動刪除該檔案, 再重新去搜尋, 就可以搜尋到了.

檔案路徑一般是在:/Users/您的使用者名稱/Library/Caches/CocoaPods/
PS: 刪掉再次搜尋, 需要一段時間, 請耐心等待.
補充
關於更多的CocoaPods
的標籤可以到CocoaPods Guides裡查詢到, 如果是遇到一些bug
可以到GitHub CocoPods留下你的Issues
.
疑問
在研究CocoaPods
的時候, 我有一個疑問, 怎麼建立一個podspec
檔案, 去關聯不同的第三方庫, 並且不會引起他們之間的衝突, 比如高德2D地圖
和高德3D地圖
就會引起Framework
的衝突.
並且可以在這個大的podspec
裡可以自由的選擇高德2D地圖
和高德3D地圖
匯入到工程裡, 不知道是CocoaPods
不支援, 還是我還沒研究透, 如果可以的話, 希望老鐵們給我解惑解惑.