Go外部库发布指南在使用Go语言开发的过程中,我们使用go get命令即可一键将对应的依赖添加到我们的项目中,我们也可以
在使用Go语言开发的过程中,我们使用go get
命令即可一键将对应的依赖添加到我们的项目中,我们也可以在Go Packages网站上查找我们想要的外部库。
不过如果说我们自己开发了一个外部库,应当如何发布出来供大家使用呢?事实上Go发布项目为外部库的步骤非常简单,我们只需把我们的代码发布到Github或者Gitee等代码平台,并创建对应的Tag
作为发布的版本号,其他人就可以直接通过go get 代码仓库地址
下载引入依赖了!
也可见Go发布外部库的流程和其它编程语言外部库的发布(例如Java的Maven中央仓库发布等)有所不同,这里就来总结一下整体的发布流程。
在学习本章节之前,需要读者对Git的基本操作包括推送代码、操作Tag
标签等有所掌握,并且需要掌握常用的Git代码平台例如Gitee、Github等等的基本使用。
1,代码工程组织
开发我们的外部库时,需要按照一定的规范组织好我们的代码文件,虽然并没有硬性的代码工程文件结构要求,不过官方也给出了不同工程的代码组织建议:传送门
这里我们参考Basic package
部分即可:
可见我们的项目必须要开启Go Modules
即模块化支持(高版本Go默认开启了),且直接将mod.go
模块文件与对应的代码文件全部放在项目根目录下即可。
例如我这里要发布的代码项目:
可见go.mod
及其代码文件都直接放在项目根目录下即可。
xxx_test.go
是单元测试文件,用于测试代码的功能,是非必须的。
2,发布代码到Gitee或Github等代码平台
然后,我们需要发布代码到Gitee或者Github等代码平台了!这里以Gitee为例,发布我们的项目代码。
发布之前,我们首先需要修改go.mod
文件中module
指令,即我们的包名,包名需要和我们项目发布后的Git在线仓库地址一致,例如我这里:
module gitee.com/swsk33/sclog
这是因为我要发布到Gitee上,我的用户名是swsk33
,并且我要发布到的在线仓库名称(路径)为sclog
,所以这里模块名就需要设定为gitee.com/swsk33/sclog
,如果发布到其它平台例如Github、Gitlab等也是一回事。
好的,现在就可以发布了,登录Gitee后创建仓库路径为sclog
,并通过git push
命令发布,此时在线仓库如下:
可见代码和go.mod
等文件都在仓库根目录下。
3,创建并推送Tag
仅仅发布代码还是不行的,我们需要创建Tag
并推送至在线仓库,这样才会被视为发布了一个版本。当我们给一个Git仓库创建了一个Tag
,那么这个Tag
就会一直指向当前最新的commit
提交且不会改变。
有两种方式可以创建发布Tag
,大家选择其中一种方式即可。
(1) 使用git tag
命令
确保代码完成、进行git commit
并提交到远程仓库后,就可以创建tag
了,tag
的名称通常是带v
的版本号,例如v1.0.0
,通过下列命令创建tag
并将其推送至远程仓库:
# 创建tag
git tag v1.0.0
# 推送tag到远程仓库
git push origin v1.0.0
此时,这个tag
就被推送至远程仓库了,可以在标签一栏查看:
(2) 直接创建发行版/Release
除了通过git tag
命令,还可以直接在我们的在线仓库中创建发行版,以Gitee为例,点击右侧发行版(Github中是Releases):
右上角创建:
填写你要创建的Tag
名称,通常是版本号例如v1.0.0
如下:
其余字段自行填写,最后创建发行版即可。
当创建了一个发行版后,Tag
也会被同时创建,只不过在发行版中还可以填写更多的版本信息例如更新描述,甚至是添加附件等等,并在仓库页面显示。
可见,一个Tag
就是对应了我们发布的一个版本。
4,下载依赖一次
创建完成Tag
后,我们实际上就已经完成了我们外部库的发布了!不过如果现在进入Go Packages网站搜索,是仍然查不到我们的外部库的。
我们需要先通过go get
命令下载一次我们自己的依赖库,创建一个新工程,通过下列命令下载依赖,例如我这里:
go get gitee.com/swsk33/sclog
这时,Go工具链会访问gitee.com/swsk33/sclog
的Git仓库,检查仓库中的代码、版本标签,并解析go.mod
文件以拉取模块信息,它会拉取最新的Tag
对应的代码并安装至我们$GOPATH/pkg/mod
目录下。
与此同时,第一次通过go get
下载后,Go Packages网站也会自动抓取并索引我们的库及其对应最新的Tag
,并缓存该版本的全部代码、文档等等,过几分钟后就可以在Go Packages网站中搜索到自己的外部库了!
命令
go get 仓库地址
默认下载该仓库中最新的那个Tag
(版本),也可以通过go get 仓库地址@Tag名称
下载指定版本的依赖。
5,以后更新再发布
假设这个外部库后续更新了代码,添加了新的功能或者修复了bug,我们只需像往常一样,进行commit
并push
到在线仓库后,创建一个新的Tag
推送到在线仓库,并自己通过go get
下载一次依赖即可(重复上述第3
,4
部分)。
6,移除一个版本
假设我们的外部库已发布了多个版本,但是其中有几个版本是包含重大问题或者不经意间发布的,我们如何删除这些版本呢?
事实上,我们发布的所有版本,一旦被Go Packages网站索引到,就无法再次被删除,即使你在你的在线仓库中删除了对应的Tag
,Go Packages中对应的版本及其代码也不会被删除,该版本仍然可以通过go get
获取。
不过,我们可以隐藏这个版本,使其被标记为不可用,在项目go.mod
文件中使用retract
指令隐藏版本即可,下面是几个示例:
// 隐藏v1.0.0这个Tag(版本)
retract v1.0.0
// 隐藏多个版本(v1.0.0和v1.0.1版本)
retract (
v1.0.0
v1.0.1
)
// 隐藏从v1.0.0到v1.9.9之间的全部版本(包括这两者)
retract [v1.0.0, v1.9.9]
加入隐藏指令后,下次再发布新的版本并被Go Packages网站索引后,所有通过retract
指令隐藏的版本就无法再被用户获取,且会在Go Packages网站中被标记为隐藏。
所以,我们在发布每个版本的时候也需要谨慎发布,确保代码没有任何问题。
参考文档:
转载自:https://juejin.cn/post/7420718386953109519