- 作者:老汪软件技巧
- 发表时间:2024-10-05 00:01
- 浏览量:
在使用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,所以这里模块名就需要设定为/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工具链会访问/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网站中被标记为隐藏。
所以,我们在发布每个版本的时候也需要谨慎发布,确保代码没有任何问题。
参考文档: