背景
- 随着公司业务的不断发展,应用的代码体积将会越来越大,业务代码耦合也越来越多,代码量也是急剧增加
- 如果仅仅完成代码拆分还不足以解决业务之间的代码耦合,而组件化是一种能够解决代码耦合、业务工程能够独立运行的技术
- 这篇文章主要介绍远程私有库的创建和管理以及本地索引库的使用
本文以创建 公有库
为例
查看本地索引库
- 我们用 cocoaPods 的时候,默认使用的是cocoaPods自带的索引库
终端中使用命令$ 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
组件化分类
公有库:所有人都能使用
私有库:公司内部拥有特殊权限才能使用
framework:公私都有,动态库静态库。只能看到.h文件。
准备工作
GitHub
账号一个:上传组件工程用安装
CocoaPods
:创建并验证pod
用安装
Git
命令行 :首次上传组件工程用安装
Github Desktop
或者SourceTree
:后续更新组件用的,Git命令使用熟练者忽略此项
创建公有库
- 首先在
Github
创建一个新的Repository
,你的pods
最终要托管在Github
平台上的,所以在Github
上创建一个空的Repository
注意:库名 = 项目前缀 + 组件名称
,如 ZJWeakProxy = 解决循环引用组件库
- 创建完成后的信息如下:
注册 cocoapods 账户
先安装
cocoapods
,这个很简单,可以百度搜索自行安装想要创建一个开源
pod
库,首先我们需要注册cocoapods账户
,基于cocoapods
已经安装好的前提下,这里直接使用trunk
去注册cocopods账户
,在终端执行:
pod trunk register 邮箱地址 '用户名' --verbose
mac@bogon ~ % pod trunk register 13718004742@163.com 'BboyZJ' --verbose
邮箱地址:一般会使用 GitHub邮箱
用户名:随便
- 注册之后,在邮箱会受到确认邮件
- 注册成功之后可以在终端
验证是否注册成功
:
// 验证是否注册成功
mac@bogon ~ % pod trunk me
- 查看注册信息,以后可以使用该开源pod库发布工具,也可以通过此方式查看已经发布过的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
在本地创建pod库
- 利用pod命令创建名为
ZJWeakProxy
的pod
库
注:这个名字要和 GitHub
创建的 Repository
名一致
# cd 到桌面文件夹(组件文件夹)ZJComponent目录下,这个不强制随意
mac@bogon ~ % cd ZJComponent
# 执行 pod lib create ZJWeakProxy
mac@bogon ~ % pod lib create ZJWeakProxy
- 出现 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 报错
原因分析:一般这是因为服务器的 SSL 证书没有经过第三方机构的签署,所以才报错
解决办法:接触 SSL 验证,再次执行
mac@bogon ZJComponent % git config --global http.sslVerify false
- 执行完上述命令后,会问你几个问题,按需求填写即可
# 你想使用哪个平台?
1、What platform do you want to use?? [ iOS / macOS ]
iOS
# 库语言选择?
2、What language do you want to use?? [ Swift / ObjC ]
ObjC
# 是否需要一个demo工程,用于调试Pod?
3、Would you like include a demo application with your library? [ Yes / No ]
Yes
# 你要使用哪个测试框架?
4、Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
# 是否要UI测试?
5、Would you like to do view based testing? [ Yes / No ]
NO
# 类名前缀?
6、What is your class prefix?
ZJ
- 到这里 pod 库就创建完成了,它会自己打开刚才创建的pod库
工程目录介绍
- 目录结构如下:
【第1部分】:主要是用来编辑pod相关配置元数据区
【第2部分】:主要是用来验证pod效果区
【第3部分】:主要是用来 提供给别人使用暴露出来的pod,ReplaceMe空的可以删除,是提示我们可以添加自己的类
- 配置
podspec
Pod::Spec.new do |s|
# 库名称
s.name = 'ZJWeakProxy'
# 版本号
s.version = '0.1.0'
# 库简短介绍
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!
# 开源库描述
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 开源库地址,或者是博客、社交地址等
s.homepage = 'https://github.com/BboyZJ/ZJWeakProxy'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 开源协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 开源库作者
s.author = { 'BboyZJ' => '13718004742@163.com' }
# 开源库资源文件
s.source = { :git => 'https://github.com/BBoyZJ/ZJWeakProxy.git', :tag => s.version.to_s }
# 社交网址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 开源库最低支持
s.ios.deployment_target = '10.0'
# 开源库源文件
s.source_files = 'ZJWeakProxy/Classes/**/*'
# 添加资源文件
# s.resource_bundles = {
# 'ZJWeakProxy' => ['ZJWeakProxy/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# 依赖系统库 多个用逗号隔开
# s.frameworks = 'UIKit', 'MapKit'
# 引入第三方依赖库
# s.dependency 'AFNetworking', '~> 2.3'
end
- 需要注意如图:
- Readme 主要是介绍这个组件的用途和使用,可以随时编辑。目前就确认一下自己的名字和邮箱就可以了
【第1部分】:主要是用来编辑pod相关配置元数据区
【第2部分】:主要是用来验证pod效果区
【第3部分】:主要是用来 提供给别人使用暴露出来的pod,ReplaceMe空的可以删除,是提示我们可以添加自己的类
- 配置 podspec
Pod::Spec.new do |s|
# 库名称
s.name = 'ZJWeakProxy'
# 版本号
s.version = '0.1.0'
# 库简短介绍
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!
# 开源库描述
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 开源库地址,或者是博客、社交地址等
s.homepage = 'https://github.com/BboyZJ/ZJWeakProxy'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
# 开源协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 开源库作者
s.author = { 'BboyZJ' => '13718004742@163.com' }
# 开源库资源文件
s.source = { :git => 'https://github.com/BBoyZJ/ZJWeakProxy.git', :tag => s.version.to_s }
# 社交网址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
# 开源库最低支持
s.ios.deployment_target = '10.0'
# 开源库源文件
s.source_files = 'ZJWeakProxy/Classes/**/*'
# 添加资源文件
# s.resource_bundles = {
# 'ZJWeakProxy' => ['ZJWeakProxy/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# 依赖系统库 多个用逗号隔开
# s.frameworks = 'UIKit', 'MapKit'
# 引入第三方依赖库
# s.dependency 'AFNetworking', '~> 2.3'
end
- 需要注意如图:
- Readme 主要是介绍这个组件的用途和使用,可以随时编辑。目前就确认一下自己的名字和邮箱就可以了
- 协议文件,也是确认一下自己的名字和邮箱就可以了
添加自己的类
- 打开pod库目录,删除ReplaceMe
- 创建 ZJWeakProxy 简单类,声明一个打印函数,方便后续测试
注:创建类文件一定要放到 Classes 目录下
.h 文件下
#import "ZJWeakProxy.h"
@interface ZJWeakProxy : NSProxy
- (void)printZJWeakProxy;
@end
.m 文件下
#import "ZJWeakProxy.h"
@implementation ZJWeakProxy
- (void)printZJWeakProxy{
NSLog(@"%s",__func__);
}
@end
- 此时
cd
到Example
路径下执行pod install
命令,看看是否能将刚刚添加的库文件引入到工程中
mac@bogon ~ % cd /Users/mac/Desktop/ZJComponent/ZJWeakProxy/Example
mac@bogon Example % pod install
如果成功会在Pods中看到:
- 可以到项目中导入头文件简单使用一下
证明是可用的
项目上传与发布
- cd到你的项目路径下,将项目上传到GitHub中(即刚刚创建的ZJWeakProxy公有库中),依次使用下列命令行,不要遗漏
# cd 到 组件ZJWeakProxy路径下
mac@bogon Example % cd /Users/mac/Desktop/ZJComponent/ZJWeakProxy
# 添加github项目路径
mac@bogon ZJWeakProxy % git remote add origin https://github.com/BboyZ/ZJWeakProxy.git
# 添加文件
mac@bogon ZJWeakProxy % git add .
# 将暂存区里的改动提交到本地的版本库
mac@bogon ZJWeakProxy % git commit -m "first commit"
# 创建分支main
mac@bogon ZJWeakProxy % git branch -M main
# 提交版本号并push到main分支
mac@bogon ZJWeakProxy % git push -u origin main
# 注意这里的版本号要与.podspec中的版本号保持一致
mac@bogon ZJWeakProxy % git tag 0.1.0
mac@bogon ZJWeakProxy % git push origin 0.1.0
- 在执行
git push -u origin main
时,如果遇到需要输入用户名和密码:
Username for 'https://github.com': BboyZJ
Password for 'https://BboyZJ@github.com':
【注意】:这个 密码
不是你 GitHub
的登录密码,而是需要生成一个 access tokens
- 生成
access token
需要在 GitHub
个人设置页 -> Settings -> Developer Settings -> Personal access tokens 中创建一个 token
-
Generate new token 生成新的
token
- 设置
token
的有效期 按需设置,访问权限等
- 设置
* 选择要授予令牌token的范围或权限
* 要使用token从命令行访问仓库,请选择repo
* 要使用token从命令行删除仓库,请选择delete_repo
* 其他根据需要进行勾选
- 点击
Generate token
生成token
ghp_VcqgAmF...ZPJ2IGxu0
【注】:记得把这个 token
保存下来,因为下次再刷新这个页面的时候,你会看不到了
- 在命令行输入完
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库已经push上去了
使用和验证
- 新建个带
pod
的项目,把我们做好的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
- 执行 pod install
mac@bogon ZJWeakProxy-Demo % pod install
【问题1】安装报错:[!] Unable to find a specification for ZJWeakProxy
解决办法:
mac@bogon ZJWeakProxy-Demo % pod repo update --verbose
【问题2】:HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
解决办法:更改默认通信协议
mac@bogon ZJWeakProxy-Demo % git config --global http.version HTTP/1.1
- 引入头文件并打印结果
版本更新与维护
-
现在的
ZJWeakProxy
库已经在GitHub上托管了,以后维护这个项目就可以了(开始本地创建的ZJWeakProxy项目就可以删除了),管理GitHub仓库,有两种方案:可以使用命令行 git clone https://github.com/BboyZJ/ZJWeakProxy
-
也可以使用 GitHub Desktop
- 下载 GitHub Desktop 登录你的用户名和密码,
File -> Responsitory
- 下载 GitHub Desktop 登录你的用户名和密码,
其实
GitHub Desktop
更加可视化一些,上面History就是刚才git命令行的记录
总结
终于写完了,哇哦😮!