go 发布自己的第三方包

华为云社区 : 发布第三方包管理
上面是这个讲的有点简单了

简单来说就是, go get 会下载我们代码仓库的tag, 没有 tag 会默认下载 最后一次提交的 commit , 并标注为 类似 v0.0.0-20170915032832-14c0d48ead0c 这种

制作包的流程

  • 创建git 项目仓库
github.com/yxl/first   //  git 仓库地址,这个地址相当于go 模块基本 module 名字

仓库地址为 github/组织名/项目名

image.png
  • 下载项目到本地
    初始化 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


    创建仓库

    创建完成, 跳转到项目首页


    首页地址 url 就是我们一会 go mod init 的地址
  • 下载项目到本地

go mod init github.com/tiankonglanyu/go_module_publish
go mod init 初始化 module , 和仓库路径一致
  • 修改代码添加 接口函数并提交
    顶级文件代码, 这里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()
}

提交注意先添加一下 ssh key

(遇不能 push 的情况,直接 百度就可以,都是小问题)
记得要启动 go mod 才行

没有tag 默认是最后一次提交的
  • 运行go get 的包里的函数


    运行成功了
  • 制作包的 tag
    git tag 命令, 然后 push 创建的 tag 到仓库


    git 创建tag 并 push
git push tag 之后仓库就有这 tag了
  • 下载刚提交的tag包


    获取到了新版本并成功运行了

注意不管是分支还是master 的tag, go get 都是可以直接下载升级到最新的 tag, 不是只从 master 的tag 下载

  • 同步 go pkg


    github 的包, go get 之后会自动同步到 go pkg
而且直接生成了 接口文档, 很强

---------------- over ----------------------

:

你可能感兴趣的:(go 发布自己的第三方包)