开发了一个Go模块,该如何发布呢?

前言

早些时间小鱼为了能监控微博大 V 对基金趋势的分享,以及大 V 的公开的实盘操作,弄了一个微博推文监控模块,也上传到了 github,但在项目中调用的时候发现版本并不是我所发布的。

譬如:发布版本为 v 1.0,但是下载的版本却是 v0.0.0-20240318074646-d39b0bad549d 这种格式,并不是小鱼所定义的版本号,而是默认生成的版本号。

由于对项目开发没太大影响,小鱼当时并没有去理会这种小问题。

项目到现在已经稳定运行了一段时间,但昨天这个微博监控模块突然遇到一些无法解析的情况,正好趁这个机会把 Go 模块版本规则弄明白。

创建 Go 模块

Go 项目代码通常在 github 上管理托管,如果我们需要上传到 github 上,那么 Go 模块的项目名应当与 GitHub 的仓库对应起来。

go mod init github.com/{username}/{repo-name}

  • username:GitHub 账号名
  • repo-name:仓库名

再去 GitHub 创建这个仓库,名称要一致。后期开发时需要通过 GitHub 来下载该模块。

示例:

shell 复制代码
go mod init github.con/berbai/test

我们可以得到一个 go.mod 文件,内容如下

mod 复制代码
module github.com/berbai/test

go 1.21.4

到这里,我们已经完成对 Go 模块的创建,只是这个 Go 模块没有提供任何代码。

我们来编写一个简单的示例。

go 复制代码
package test

func Version() string {
	return "v1.0.0"
}

有这个 version.go 文件后,我们的 go 模块就有了最简单的功能------获取模版版本。

发布 Go 模块

本地代码与 GitHub 仓库关联这个相信各位老手同志们已经谙熟于心了,为了保证文章连贯性,此处不叙述。

  1. go 模块开发过程中可能涉及到一些未使用的模块依赖,可以通过 go mod tidy 进行清除。
  2. 发布前,做好测试,go test {单测用例文件},本示例中未给出测试文件。
  3. 创建 go 模块版本,其实是通过 git tag {version},将版本号命名为标签名,如 git tag v1.0.0
  4. 通过 git push origin {version} 将 tag 推送至 GitHub,如 git push origin v1.0.0
  5. 最后,go list 刷新 go 模块的索引,如 GOPROXY=proxy.golang.org go list -m github.com/fasionchan/[email protected],到此我们的 go 模块已经正式发布了。这里的示例指定刷新 go 官方的模块代理(GOPROXY=proxy.golang.org)。

通过 go get 指令可以下载该模块。

shell 复制代码
# 获取最新版本
go get github.com/berbai/test
# 指定版本获取
go get github.com/berbai/[email protected]

到这里似乎并不会出现前言中小鱼遇到的 Go 模块版本问题。但当你随意地命名版本号,比如命名为 v1,这时候你会发现无法通过 v1 获取到 go 模块。

究其原因,go 的模块代理对版本号是由要求的,发布 go 模块版本,版本形式需要遵循要求: https://go.dev/ref/mod#versions

版本号是有具体意义的,比如 v 1.2.3。

  • 1 表示主版本号:发布了不兼容的版本迭代时递增。
  • 2 表示次版本号:发布了功能性更新时递增。
  • 3 表示修订号:发布了 bug 修复类更新时递增

到这里小鱼修改了 go 模块的版本号,遇到的问题也就解决啦。

参考

https://go.dev/ref/mod#versions

相关推荐
我命由我123452 小时前
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
java·服务器·开发语言·jvm·后端·架构·java-ee
whoarethenext5 小时前
qt的基本使用
开发语言·c++·后端·qt
草捏子9 小时前
主从延迟导致数据读不到?手把手教你架构级解决方案
后端
橘猫云计算机设计9 小时前
基于Python电影数据的实时分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·后端·python·信息可视化·小程序·毕业设计
Yolo@~9 小时前
SpringBoot无法访问静态资源文件CSS、Js问题
java·spring boot·后端
大鸡腿同学10 小时前
资源背后的成事密码
后端
Asthenia041210 小时前
使用 Spring Cloud Gateway 实现四种限流方案:固定窗口、滑动窗口、令牌桶与漏桶
后端
老李不敲代码11 小时前
榕壹云门店管理系统:基于Spring Boot+Mysql+UniApp的智慧解决方案
spring boot·后端·mysql·微信小程序·小程序·uni-app·软件需求
海风极客11 小时前
Go小技巧&易错点100例(二十五)
开发语言·后端·golang
喵手11 小时前
如何使用 Spring Boot 实现分页和排序?
数据库·spring boot·后端