OC組件化01:制作pod上傳自己的Github

背景

  • 隨著公司業(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ù)

image.png
  • 創(chuàng)建完成后的信息如下:
image.png

注冊(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)郵件
image.png
  • 注冊(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)建名為 ZJWeakProxypod 庫(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

原因分析:一般這是因?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)如下:
image.png

【第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
  • 需要注意如圖:
image.png
  • Readme 主要是介紹這個(gè)組件的用途和使用,可以隨時(shí)編輯。目前就確認(rèn)一下自己的名字和郵箱就可以了
image.png

【第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
  • 需要注意如圖:
image.png
  • Readme 主要是介紹這個(gè)組件的用途和使用,可以隨時(shí)編輯。目前就確認(rèn)一下自己的名字和郵箱就可以了
image.png
  • 協(xié)議文件,也是確認(rèn)一下自己的名字和郵箱就可以了
image.png

添加自己的類

  • 打開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í) cdExample 路徑下執(zhí)行 pod install 命令,看看是否能將剛剛添加的庫(kù)文件引入到工程中
mac@bogon ~ % cd /Users/mac/Desktop/ZJComponent/ZJWeakProxy/Example 
mac@bogon Example % pod install

如果成功會(huì)在Pods中看到:

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

證明是可用的

項(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

image.png
  • Generate new token 生成新的 token

    • 設(shè)置 token 的有效期 按需設(shè)置,訪問(wèn)權(quán)限等
    image.png
* 選擇要授予令牌token的范圍或權(quán)限

* 要使用token從命令行訪問(wèn)倉(cāng)庫(kù),請(qǐng)選擇repo

* 要使用token從命令行刪除倉(cāng)庫(kù),請(qǐng)選擇delete_repo
image.png
* 其他根據(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'.

由上面看代表上傳成功了

使用和驗(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

image.png

解決辦法:

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

image.png

解決辦法:更改默認(rèn)通信協(xié)議

mac@bogon ZJWeakProxy-Demo % git config --global http.version HTTP/1.1

  • 引入頭文件并打印結(jié)果
image.png

版本更新與維護(hù)

  • 現(xiàn)在的 ZJWeakProxy 庫(kù)已經(jīng)在GitHub上托管了,以后維護(hù)這個(gè)項(xiàng)目就可以了(開始本地創(chuàng)建的ZJWeakProxy項(xiàng)目就可以刪除了),管理GitHub倉(cāng)庫(kù),有兩種方案:

  • 其實(shí) GitHub Desktop 更加可視化一些,上面History就是剛才git命令行的記錄

總結(jié)

終于寫完了,哇哦??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容