华为云社区 : 发布第三方包管理
上面是这个讲的有点简单了
简单来说就是, go get 会下载我们代码仓库的tag, 没有 tag 会默认下载 最后一次提交的 commit , 并标注为 类似 v0.0.0-20170915032832-14c0d48ead0c 这种
制作包的流程
- 创建git 项目仓库
github.com/yxl/first // git 仓库地址,这个地址相当于go 模块基本 module 名字
仓库地址为 github/组织名/项目名
- 下载项目到本地
初始化 go module
go mod init github.com/项目分类/项目名
这里的一定是"github.com/组织名/项目名"这样的格式
要注意模块名非常重要,就这相当于声明了我们的模块名称,以后要想使用该模块就需要使用这个名称来获取模块
编辑代码
可以直接在顶层文件夹,编辑,那最外层 package 就是我们 mod init 的名字(和项目地址格式一致), 或者也可以 创建子文件夹(和普通 mod使用方式差不多, 如果子包的话,引入和普通 mod 包一样,直接在顶级包后面加 /子包名 这样就可以了)提交代码, 生成 tag
git commit -am "add stringsx package content"
git push -u origin master
git tag v1.0.0
git push --tags
不管你用什么提交,界面操作也可以,总之最后就是把提交的代码弄一个 tag 出来(不弄也可以,会用最后commit 的版本)
tag 格式为
主版本号.次版本号.修订号
主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号:当你做了向下兼容的问题修正
当然这个版本号只是一般要的规范,你也可以不按照这个格式
Modules 的版本强烈推荐使用上面语义化的版本控制
修改代码, 创建新 tag
创建的新 tag 就是包的不同版本了。在原来的 tag 的代码直接修改,提交,创建新 tag 就可以了使用 新 tag的包
1 go get -u xxx (- u 获取包的最新tag)
2 go get package@version (version 即 tag)
3 直接编辑 mod 文件,修改版本号, 然后 go mod tidy跟新
这三种方法都是可以的
- 主版本上级
这个就不是 直接修改然后 tag 了
我们认为两个大版本之间是互相不兼容的, 比如 v2 对于 v1 是不兼容的(当然这是我们人分类的, 你要是觉得看着顺眼,也可以 tag v2 然后使用)
如果我们认为 修改了东西,和之前的版本完全不同, 有些函数参数不一样了, 那如果使用者在更新的话, 导致代码运行不起来了,那就惨了。所以我们要做的是 创建一个新的模块名字 用来 go get (区分之前低版本的名字)。
创建新的主版本, 如果你要把新的主版本合到 master, 那之前的 版本只能在 分支维护了, 或者不维护
新建分支
下载新分支,作为版本 v2
创建新的模块名字
go mod init github.com/yxl/first/v2
修改后 tag 最好是 v2.xx.xx , 让开发者一目了然,这是 v2 版本的 tag
下载 v2 版本包
go get "github.com/yxl/first/v2"
使用新版本 包
import github.com/yxl/first/v2
v2.xxx
所以v2 版本和 之前的版本,包的名字都不一样了, 也就不会相互影响了。 之前版本的 包,也可以同时在项目引入使用了。
哈哈!!
注意点:
- 仓库项目地址就是 包名,生成包 go mod init 和 使用 import 保持一致
- 新版本,不兼容的化, 生成包 go mod init 和 使用 import 保持一致, (包名需要在仓库地址后面 /v2 来标记, 来区分低版本)
实际操作
-
创建仓库 go_module_publish
创建完成, 跳转到项目首页
下载项目到本地
go mod init github.com/tiankonglanyu/go_module_publish
- 修改代码添加 接口函数并提交
顶级文件代码, 这里package 就写 init 的最后一个项目名就可以, 不用写github.xxx/xxx/x 这么长,(因为 包名不能带.特殊字符??)
// @Time : 2022/3/12 22:08
// @Author : yxl
// @File : hello_world.go
package go_module_publish
import "fmt"
import "github.com/tiankonglanyu/go_module_publish/child_package"
func Hello(){
fmt.Println("hello world, this is my first publish module")
fmt.Println("this Hello func in top package")
child_package_.Child()
}
(遇不能 push 的情况,直接 百度就可以,都是小问题)
记得要启动 go mod 才行
-
运行go get 的包里的函数
-
制作包的 tag
git tag 命令, 然后 push 创建的 tag 到仓库
-
下载刚提交的tag包
注意不管是分支还是master 的tag, go get 都是可以直接下载升级到最新的 tag, 不是只从 master 的tag 下载
-
同步 go pkg
---------------- over ----------------------
: