背景
- 隨著公司業(yè)務(wù)的不斷發(fā)展,應(yīng)用的代碼體積將會(huì)越來(lái)越大,業(yè)務(wù)代碼耦合也越來(lái)越多,代碼量也是急劇增加
- 如果僅僅完成代碼拆分還不足以解決業(yè)務(wù)之間的代碼耦合,而組件化是一種能夠解決代碼耦合、業(yè)務(wù)工程能夠獨(dú)立運(yùn)行的技術(shù)
- 這篇文章主要介紹遠(yuǎn)程私有庫(kù)的創(chuàng)建和管理以及本地索引庫(kù)的使用
本文以創(chuàng)建 公有庫(kù) 為例
查看本地索引庫(kù)
- 我們用 cocoaPods 的時(shí)候,默認(rèn)使用的是cocoaPods自帶的索引庫(kù)
終端中使用命令$ pod repo
cocoapods
- Type: git (remotes/origin/master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/mac/.cocoapods/repos/cocoapods
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/mac/.cocoapods/repos/trunk
2 repos
組件化分類
公有庫(kù):所有人都能使用
私有庫(kù):公司內(nèi)部擁有特殊權(quán)限才能使用
framework:公私都有,動(dòng)態(tài)庫(kù)靜態(tài)庫(kù)。只能看到.h文件。
準(zhǔn)備工作
GitHub賬號(hào)一個(gè):上傳組件工程用安裝
CocoaPods:創(chuàng)建并驗(yàn)證pod用安裝
Git命令行 :首次上傳組件工程用安裝
Github Desktop或者SourceTree:后續(xù)更新組件用的,Git命令使用熟練者忽略此項(xiàng)
創(chuàng)建公有庫(kù)
- 首先在
Github創(chuàng)建一個(gè)新的Repository,你的pods最終要托管在Github平臺(tái)上的,所以在Github上創(chuàng)建一個(gè)空的Repository
注意:庫(kù)名 = 項(xiàng)目前綴 + 組件名稱 ,如 ZJWeakProxy = 解決循環(huán)引用組件庫(kù)

- 創(chuàng)建完成后的信息如下:

注冊(cè) cocoapods 賬戶
先安裝
cocoapods,這個(gè)很簡(jiǎn)單,可以百度搜索自行安裝想要?jiǎng)?chuàng)建一個(gè)開源
pod庫(kù),首先我們需要注冊(cè)cocoapods賬戶,基于cocoapods已經(jīng)安裝好的前提下,這里直接使用trunk去注冊(cè)cocopods賬戶,在終端執(zhí)行:
pod trunk register 郵箱地址 '用戶名' --verbose
mac@bogon ~ % pod trunk register 13718004742@163.com 'BboyZJ' --verbose
郵箱地址:一般會(huì)使用 GitHub郵箱
用戶名:隨便
- 注冊(cè)之后,在郵箱會(huì)受到確認(rèn)郵件

- 注冊(cè)成功之后可以在終端
驗(yàn)證是否注冊(cè)成功:
// 驗(yàn)證是否注冊(cè)成功
mac@bogon ~ % pod trunk me
- 查看注冊(cè)信息,以后可以使用該開源pod庫(kù)發(fā)布工具,也可以通過(guò)此方式查看已經(jīng)發(fā)布過(guò)的pods:
mac@bogon ~ % pod trunk me
- Name: BboyZJ
- Email: 13718004742@163.com
- Since: October 20th, 2021 19:20
- Pods:
- ZJSDKDemo
- ZJSDK_iOS
- Sessions:
- October 20th, 2021 19:20 - March 31st, 2022 04:01. IP: 114.253.15.66
Description: iMac
- February 27th, 02:33 - July 5th, 02:37. IP:
114.252.233.188
在本地創(chuàng)建pod庫(kù)
- 利用pod命令創(chuàng)建名為
ZJWeakProxy的pod庫(kù)
注:這個(gè)名字要和 GitHub 創(chuàng)建的 Repository 名一致
# cd 到桌面文件夾(組件文件夾)ZJComponent目錄下,這個(gè)不強(qiáng)制隨意
mac@bogon ~ % cd ZJComponent
# 執(zhí)行 pod lib create ZJWeakProxy
mac@bogon ~ % pod lib create ZJWeakProxy
- 出現(xiàn) fatal: unable to access 'https://github.com/CocoaPods/pod-template.git/': HTTP/2 stream 1 was not closed cleanly before end of the underlying stream 報(bào)錯(cuò)
原因分析:一般這是因?yàn)榉?wù)器的 SSL 證書沒(méi)有經(jīng)過(guò)第三方機(jī)構(gòu)的簽署,所以才報(bào)錯(cuò)
解決辦法:接觸 SSL 驗(yàn)證,再次執(zhí)行
mac@bogon ZJComponent % git config --global http.sslVerify false
- 執(zhí)行完上述命令后,會(huì)問(wèn)你幾個(gè)問(wèn)題,按需求填寫即可
# 你想使用哪個(gè)平臺(tái)?
1、What platform do you want to use?? [ iOS / macOS ]
iOS
# 庫(kù)語(yǔ)言選擇?
2、What language do you want to use?? [ Swift / ObjC ]
ObjC
# 是否需要一個(gè)demo工程,用于調(diào)試Pod?
3、Would you like include a demo application with your library? [ Yes / No ]
Yes
# 你要使用哪個(gè)測(cè)試框架?
4、Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
# 是否要UI測(cè)試?
5、Would you like to do view based testing? [ Yes / No ]
NO
# 類名前綴?
6、What is your class prefix?
ZJ
- 到這里 pod 庫(kù)就創(chuàng)建完成了,它會(huì)自己打開剛才創(chuàng)建的pod庫(kù)
工程目錄介紹
- 目錄結(jié)構(gòu)如下:

【第1部分】:主要是用來(lái)編輯pod相關(guān)配置元數(shù)據(jù)區(qū)
【第2部分】:主要是用來(lái)驗(yàn)證pod效果區(qū)
【第3部分】:主要是用來(lái) 提供給別人使用暴露出來(lái)的pod,ReplaceMe空的可以刪除,是提示我們可以添加自己的類
- 配置
podspec
Pod::Spec.new do |s|
# 庫(kù)名稱
s.name = 'ZJWeakProxy'
# 版本號(hào)
s.version = '0.1.0'
# 庫(kù)簡(jiǎn)短介紹
s.summary = 'A short description of ZJWeakProxy.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
# 開源庫(kù)描述
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 開源庫(kù)地址,或者是博客、社交地址等
s.homepage = 'https://github.com/BboyZJ/ZJWeakProxy'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 開源協(xié)議
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 開源庫(kù)作者
s.author = { 'BboyZJ' => '13718004742@163.com' }
# 開源庫(kù)資源文件
s.source = { :git => 'https://github.com/BBoyZJ/ZJWeakProxy.git', :tag => s.version.to_s }
# 社交網(wǎng)址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 開源庫(kù)最低支持
s.ios.deployment_target = '10.0'
# 開源庫(kù)源文件
s.source_files = 'ZJWeakProxy/Classes/**/*'
# 添加資源文件
# s.resource_bundles = {
# 'ZJWeakProxy' => ['ZJWeakProxy/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# 依賴系統(tǒng)庫(kù) 多個(gè)用逗號(hào)隔開
# s.frameworks = 'UIKit', 'MapKit'
# 引入第三方依賴庫(kù)
# s.dependency 'AFNetworking', '~> 2.3'
end
- 需要注意如圖:

- Readme 主要是介紹這個(gè)組件的用途和使用,可以隨時(shí)編輯。目前就確認(rèn)一下自己的名字和郵箱就可以了

【第1部分】:主要是用來(lái)編輯pod相關(guān)配置元數(shù)據(jù)區(qū)
【第2部分】:主要是用來(lái)驗(yàn)證pod效果區(qū)
【第3部分】:主要是用來(lái) 提供給別人使用暴露出來(lái)的pod,ReplaceMe空的可以刪除,是提示我們可以添加自己的類
- 配置 podspec
Pod::Spec.new do |s|
# 庫(kù)名稱
s.name = 'ZJWeakProxy'
# 版本號(hào)
s.version = '0.1.0'
# 庫(kù)簡(jiǎn)短介紹
s.summary = 'A short description of ZJWeakProxy.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
# 開源庫(kù)描述
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 開源庫(kù)地址,或者是博客、社交地址等
s.homepage = 'https://github.com/BboyZJ/ZJWeakProxy'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 開源協(xié)議
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 開源庫(kù)作者
s.author = { 'BboyZJ' => '13718004742@163.com' }
# 開源庫(kù)資源文件
s.source = { :git => 'https://github.com/BBoyZJ/ZJWeakProxy.git', :tag => s.version.to_s }
# 社交網(wǎng)址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 開源庫(kù)最低支持
s.ios.deployment_target = '10.0'
# 開源庫(kù)源文件
s.source_files = 'ZJWeakProxy/Classes/**/*'
# 添加資源文件
# s.resource_bundles = {
# 'ZJWeakProxy' => ['ZJWeakProxy/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# 依賴系統(tǒng)庫(kù) 多個(gè)用逗號(hào)隔開
# s.frameworks = 'UIKit', 'MapKit'
# 引入第三方依賴庫(kù)
# s.dependency 'AFNetworking', '~> 2.3'
end
- 需要注意如圖:

- Readme 主要是介紹這個(gè)組件的用途和使用,可以隨時(shí)編輯。目前就確認(rèn)一下自己的名字和郵箱就可以了

- 協(xié)議文件,也是確認(rèn)一下自己的名字和郵箱就可以了

添加自己的類
- 打開pod庫(kù)目錄,刪除ReplaceMe

- 創(chuàng)建 ZJWeakProxy 簡(jiǎn)單類,聲明一個(gè)打印函數(shù),方便后續(xù)測(cè)試
注:創(chuàng)建類文件一定要放到 Classes 目錄下
.h 文件下
#import "ZJWeakProxy.h"
@interface ZJWeakProxy : NSProxy
- (void)printZJWeakProxy;
@end
.m 文件下
#import "ZJWeakProxy.h"
@implementation ZJWeakProxy
- (void)printZJWeakProxy{
NSLog(@"%s",__func__);
}
@end

- 此時(shí)
cd到Example路徑下執(zhí)行pod install命令,看看是否能將剛剛添加的庫(kù)文件引入到工程中
mac@bogon ~ % cd /Users/mac/Desktop/ZJComponent/ZJWeakProxy/Example
mac@bogon Example % pod install
如果成功會(huì)在Pods中看到:

- 可以到項(xiàng)目中導(dǎo)入頭文件簡(jiǎn)單使用一下

證明是可用的
項(xiàng)目上傳與發(fā)布
- cd到你的項(xiàng)目路徑下,將項(xiàng)目上傳到GitHub中(即剛剛創(chuàng)建的ZJWeakProxy公有庫(kù)中),依次使用下列命令行,不要遺漏
# cd 到 組件ZJWeakProxy路徑下
mac@bogon Example % cd /Users/mac/Desktop/ZJComponent/ZJWeakProxy
# 添加github項(xiàng)目路徑
mac@bogon ZJWeakProxy % git remote add origin https://github.com/BboyZ/ZJWeakProxy.git
# 添加文件
mac@bogon ZJWeakProxy % git add .
# 將暫存區(qū)里的改動(dòng)提交到本地的版本庫(kù)
mac@bogon ZJWeakProxy % git commit -m "first commit"
# 創(chuàng)建分支main
mac@bogon ZJWeakProxy % git branch -M main
# 提交版本號(hào)并push到main分支
mac@bogon ZJWeakProxy % git push -u origin main
# 注意這里的版本號(hào)要與.podspec中的版本號(hào)保持一致
mac@bogon ZJWeakProxy % git tag 0.1.0
mac@bogon ZJWeakProxy % git push origin 0.1.0
- 在執(zhí)行
git push -u origin main時(shí),如果遇到需要輸入用戶名和密碼:
Username for 'https://github.com': BboyZJ
Password for 'https://BboyZJ@github.com':
【注意】:這個(gè) 密碼 不是你 GitHub 的登錄密碼,而是需要生成一個(gè) access tokens
- 生成
access token
需要在 GitHub 個(gè)人設(shè)置頁(yè) -> Settings -> Developer Settings -> Personal access tokens 中創(chuàng)建一個(gè) token

-
Generate new token 生成新的
token- 設(shè)置
token的有效期 按需設(shè)置,訪問(wèn)權(quán)限等
image.png - 設(shè)置
* 選擇要授予令牌token的范圍或權(quán)限
* 要使用token從命令行訪問(wèn)倉(cāng)庫(kù),請(qǐng)選擇repo
* 要使用token從命令行刪除倉(cāng)庫(kù),請(qǐng)選擇delete_repo

* 其他根據(jù)需要進(jìn)行勾選
- 點(diǎn)擊
Generate token生成token
ghp_VcqgAmF...ZPJ2IGxu0
【注】:記得把這個(gè) token 保存下來(lái),因?yàn)橄麓卧偎⑿逻@個(gè)頁(yè)面的時(shí)候,你會(huì)看不到了
- 在命令行輸入完
token密碼
Username for 'https://github.com': BboyZJ
Password for 'https://BboyZJ@github.com':
Enumerating objects: 91, done.
Counting objects: 100% (91/91), done.
Delta compression using up to 4 threads
Compressing objects: 100% (83/83), done.
Writing objects: 100% (91/91), 29.35 KiB | 2.45 MiB/s, done.
Total 91 (delta 23), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (23/23), done.
To https://github.com/BboyZJ/ZJWeakProxy.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
由上面看代表上傳成功了
- 打開瀏覽器 https://github.com/BboyZJ/ZJWeakProxy ,就可以看到你的pod庫(kù)已經(jīng)push上去了
使用和驗(yàn)證
- 新建個(gè)帶
pod的項(xiàng)目,把我們做好的ZJWeakProxy加入podfile文件
# Uncomment the next line to define a global platform for your project
platform :ios, '10.0'
target 'ZJWeakProxy-Demo' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# ZJWeakProxy
pod 'ZJWeakProxy',:git =>"https://github.com/BboyZJ/ZJWeakProxy.git"
# Pods for ZJWeakProxy-Demo
end
- 執(zhí)行 pod install
mac@bogon ZJWeakProxy-Demo % pod install
【問(wèn)題1】安裝報(bào)錯(cuò):[!] Unable to find a specification for ZJWeakProxy

解決辦法:
mac@bogon ZJWeakProxy-Demo % pod repo update --verbose
【問(wèn)題2】:HTTP/2 stream 1 was not closed cleanly before end of the underlying stream

解決辦法:更改默認(rèn)通信協(xié)議
mac@bogon ZJWeakProxy-Demo % git config --global http.version HTTP/1.1
- 引入頭文件并打印結(jié)果

版本更新與維護(hù)
-
現(xiàn)在的
ZJWeakProxy庫(kù)已經(jīng)在GitHub上托管了,以后維護(hù)這個(gè)項(xiàng)目就可以了(開始本地創(chuàng)建的ZJWeakProxy項(xiàng)目就可以刪除了),管理GitHub倉(cāng)庫(kù),有兩種方案:可以使用命令行 git clone https://github.com/BboyZJ/ZJWeakProxy
-
也可以使用 GitHub Desktop
- 下載 GitHub Desktop 登錄你的用戶名和密碼,
File -> Responsitory
- 下載 GitHub Desktop 登錄你的用戶名和密碼,
其實(shí)
GitHub Desktop更加可視化一些,上面History就是剛才git命令行的記錄
總結(jié)
終于寫完了,哇哦??!
