Version
| Time | Version | Description |
|---|---|---|
| 2020-03-30 | 0.0.1 | 初版提交 |

Preface
pod的原義是豆莢,cocoa原義是可可豆.所以CocoaPods的本義就是很多的可可豆的豆莢,也就是幫助我們管理可可豆豆莢的意思.
一個App可以看做是一份炒青豆,里面包含了很多的豆子,是將豆子有效管理起來,形成的一個藝術(shù)品.
所以,一個pod,就是一個豆子,一個組件,他實現(xiàn)的是一個基本的功能.更重要的是,具有復用性.我們創(chuàng)造出一個pod,就可以在其他app中隨時使用,提高我們的效率,而不是在每個app中反反復復造一樣的組件.
你能管理好的組件越多,你就能實現(xiàn)更多的功能,開發(fā)出更有用的app.
管理好自己的組件,是一個真正的碼者必須掌握的技能,而對于iOS開發(fā),幫助我們管理組件的工具,就是CocoaPods.
1 本文目標
二維碼,QuickResponseCode,簡稱QrCode,是日常生活中不可分割的一部分.
本文將創(chuàng)建一個簡單的二維碼工具,旨在闡述如何發(fā)布自己的組件(Pod),并在項目中使用.
記錄了3個Pod的發(fā)布過程,這三個pod,一個發(fā)布為公有Pod,一個發(fā)布為私有Pod,一個發(fā)布為開發(fā)Pod.
這三個pod為:
GaoQrCodeManager,將成為公有庫Pod,用來實現(xiàn)圖片和String的互相轉(zhuǎn)換.
GaoStdListViewController,將成為私有庫Pod,通用的列表展示頁面,這樣不用每次都寫一樣的列表頁面.
GaoGeometryManager,將成為本地的測試Pod,筆者喜歡用代碼進行布局,這個類是用來方便計算控件的frame的.
2 CocoaPods管理Pod的原理
1,組件.
即一個pod,實現(xiàn)了一個基本功能,代碼可以復用.
比如,AFNetworking,SDWebImage,就是比較出名的組件.
2,組件源代碼倉庫.
組件的源代碼需要發(fā)布到一個遠程的倉庫中,并且需要打好標記.
比如AFNetworking的組件源代碼倉庫,就是
https://github.com/AFNetworking/AFNetworking.git
3,項目App.
我們正在開發(fā)的App,需要引入一些組件來加快開發(fā)效率.
4,podspec文件.
是CocoaPods管理的核心文件.該文件記錄了組件的組件源代碼倉庫,使用的文件有哪些,使用的資源有哪些.
將podspec文件,發(fā)布到公有倉庫,則該pod成為公共倉庫
將podsepc文件,發(fā)布到私有倉庫,則該pod成為私有倉庫
將podspec文件,僅僅保存到本地,成為開發(fā)pod
5,本地PodSpec倉庫
6,遠程Podspec倉庫
7,podfile文件.
指定了當前項目App需要依賴哪些組件以及對應的版本.
8,項目依賴組件.
項目App中依賴的所有組件.
9,安裝組件.
當我們首次安裝組件,或者有組件新增或者刪除時,我們使用命令pod install來讓項目依賴的組件進行更新.
10,更新組件.
當項目依賴組件的僅僅是版本有變化時,我們使用命令pod update來更新項目的組件.
3 發(fā)布開發(fā)Pod
3.1 將組件源代碼上傳到github
a,本地準備組件源代碼
b,在Github上新建存放組件源代碼的倉庫,勾選生成一個MIT文件.
c,將本地的源代碼文件夾上傳到遠程倉庫
# 初始化本地倉庫
git init
# 提交本地文件到本地倉庫
git add .
git commit . -m "first init"
# 關(guān)聯(lián)本地和遠程倉庫
git remote add origin https://github.com/GikkiAres/GaoGeometryMaster.git
# 本地master分支,關(guān)聯(lián)遠程的main分支
git branch --set-upstream-to=origin/main master
# 將遠程的ReadMe文件pull下來
git pull --allow-unrelated-histories
# 將本地的代碼提交到遠程
git push -u origin master:main
d,打一個版本標簽
我這里打的最初版本標簽為0.0.1(0.0.0這樣的標簽驗證不通過,本來想用的...)
git tag 0.0.1
git push origin 0.0.1
3.2 創(chuàng)建podspec文件.
在組件源代碼目錄中,創(chuàng)建podspec文件,但是這個文件并不需要提交到遠程倉庫中.
pod spec create GaoGeometryManager
3.3 編寫podspec文件
編寫的規(guī)則這里不展開討論
3.4 驗證podspec文件
驗證pod文件是否ok
pod spec lint GaoGeometryManager.podspec --verbose
如果驗證不通過,則修改源代碼或者podspec文件直到通過驗證.
3.5 項目中使用開發(fā)pod
在項目的podfile中引入開發(fā)pod:
target 'GaoQrCodeDemoAlpha' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for Lib
pod 'GaoGeometryManager', :path => '/Users/gikkiares/Desktop/MP_MyProject/MP06_MyLibProject/MP0601_iOS/29_ViewPosition/GaoGeometryManager/GaoGeometryManager_Master_Shared/GaoGeometryManager.podspec'
end
由于是開發(fā)Pod,需要指定本地podspec文件路徑
安裝組件
pod install

可以看到,在Pods的DevelopmentPods中,已經(jīng)加入了我們的庫了.
4 發(fā)布私有Pod
前面的步驟和前面基本相同,只是在podspec文件處理的時候,需要上傳到自己的一個私有倉庫中去.
4.1 將組件源代碼上傳到github
a,本地準備組件源代碼
b,在Github上新建存放組件源代碼的倉庫,勾選生成一個MIT文件.
c,將本地的源代碼文件夾上傳到遠程倉庫
# 初始化本地倉庫
git init
# 提交本地文件到本地倉庫
git add .
git commit . -m "first init"
git branch -M main
# 關(guān)聯(lián)本地和遠程倉庫
git remote add origin https://github.com/GikkiAres/GaoStdListViewController.git
# 本地master分支,關(guān)聯(lián)遠程的main分支
git branch --set-upstream-to=origin/main master
# 將遠程的ReadMe文件pull下來
git pull --allow-unrelated-histories
# 將本地的代碼提交到遠程
git push -u origin master:main
d,打一個版本標簽
我這里打的最初版本標簽為0.0.1(0.0.0這樣的標簽驗證不通過,本來想用的...)
git tag 0.0.1
git push origin 0.0.1
4.2 創(chuàng)建podspec文件.
在組件源代碼目錄中,創(chuàng)建podspec文件,但是這個文件并不需要提交到遠程倉庫中.
pod spec create GaoStdListViewController
4.3 編寫podspec文件
編寫的規(guī)則這里不展開討論
4.4 驗證podspec文件
驗證pod文件是否ok
pod spec lint GaoStdListViewController.podspec --verbose
如果驗證不通過,則修改源代碼或者podspec文件直到通過驗證.
4.5 建立pod私有倉庫
就是要里創(chuàng)建一個自己倉庫,用來存放podspec文件的.
直接在github建立一個倉庫就可以了.
我這里直接建立一個遠程倉庫:
https://github.com/GikkiAres/GaoRepo
遠程私有倉庫克隆到本地:
pod repo add GaoRepo https://github.com/GikkiAres/GaoRepo
4.6 將podspec文件推送到pod私有倉庫
所謂的私有,只是指podspec文件存放的倉庫,其遠端是自己的創(chuàng)建的倉庫,而非cocoapod官方的倉庫.
如果pod依賴了其他庫,需要添加--user-libraries
pod repo push GaoRepo GaoStdListViewController.podspec --allow-warnings --verbose --use-libraries
這一步就是將podsepc文件,從本地上傳到了自己的pod私有倉庫.

可以看到,我的私有倉庫中已經(jīng)多了這個庫.
另一方面,在私有倉庫的本地端中,也同步了這個庫:

5 發(fā)布公有pod
發(fā)布公有pod的方法和發(fā)布私有的方法大致相同,只是最終podspec上傳的倉庫遠端,是cocopod的官方倉庫.
5.1 將組件源代碼上傳到github
a,本地準備組件源代碼
b,在Github上新建存放組件源代碼的倉庫,勾選生成一個MIT文件.
c,將本地的源代碼文件夾上傳到遠程倉庫
# 初始化本地倉庫
git init
# 提交本地文件到本地倉庫
git add .
# git commit . -m "first init"有什么區(qū)別?
git commit -m "first init"
git branch -M main
# 關(guān)聯(lián)本地和遠程倉庫
git remote add origin https://github.com/GikkiAres/GaoQrCodeManager.git
# 本地master分支,關(guān)聯(lián)遠程的main分支
git branch --set-upstream-to=origin/main main
# 將遠程的ReadMe文件pull下來
git pull --allow-unrelated-histories
# 將本地的代碼提交到遠程
git push -u origin
d,打一個版本標簽
我這里打的最初版本標簽為0.0.1(0.0.0這樣的標簽驗證不通過,本來想用的...)
git tag 0.0.1
git push origin 0.0.1
5.2 創(chuàng)建podspec文件.
在組件源代碼目錄中,創(chuàng)建podspec文件,但是這個文件并不需要提交到遠程倉庫中.
pod spec create GaoQrCodeManager
5.3 編寫podspec文件
編寫的規(guī)則這里不展開討論
5.4 驗證podspec文件
驗證pod文件是否ok
pod spec lint GaoQrCodeManager.podspec --verbose
如果驗證不通過,則修改源代碼或者podspec文件直到通過驗證.
5.5 將podspec文件推送到pod公有倉庫
pod公有倉庫地址是:
https://github.com/CocoaPods/Specs
我們使用以下命令提交到該倉庫:
pod trunk push GaoQrCodeManager.podspec --allow-warnings --verbose
上傳成功的提示:

上傳成功后,下面會顯示我們剛剛上傳了一個pod.

他會提示我們一個地址:
https://raw.githubusercontent.com/CocoaPods/Specs/303a02ee2d00c1699e8d029b1673b8df9cddd6d5/Specs/4/9/3/GaoQrCodeManager/0.0.1/GaoQrCodeManager.podspec.json
我們根據(jù)后面的'Specs/4/9/3'可以在對應的目錄中找到我們的podspec文件.

6 項目App安裝組件
a,編寫podfile文件
# 指定倉庫地址
source 'https://cdn.cocoapods.org'
source 'https://github.com/GikkiAres/GaoRepo'
target 'GaoQrCodeDemoAlpha' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for Lib
# 開發(fā)Pod
pod 'GaoGeometryManager', :path => '/Users/gikkiares/Desktop/MP_MyProject/MP06_MyLibProject/MP0601_iOS/29_ViewPosition/GaoGeometryManager/GaoGeometryManager_Master_Shared/GaoGeometryManager.podspec'
# 私有Pod
pod 'GaoStdListViewController'
# 共用pod
pod 'GaoQrCodeManager'
end
b,第一次安裝,以及導入組件的有改動時,使用命令pod install來更新安裝組件.
3,完成后,就可以使用了.