Go语言学习
  • README
  • Go 基础
    • go语言介绍
    • go语言主要特性
    • go内置类型和函数
    • init函数和main函数
    • 下划线
    • iota
    • 字符串
    • 数据类型:数组与切片
    • 数据类型:byte、rune与字符串
    • 变量的5种创建方式
    • 数据类型:字典
    • 指针
    • 数据类型:指针
    • 类型断言
    • 流程控制:defer延迟执行
    • 异常机制:panic和recover
    • 函数
    • go依赖管理
    • go中值传递、引用传递、指针传递区别
  • 标准库
    • Go net/http包
  • 数据结构
    • 哈希表
      • 为什么对 map 的 key 或 value 进行取址操作是不允许的
  • Gin
    • gin 快速开始
    • gin-swagger用法
  • Go 进阶
    • Go 指针
    • Go 中的 GC 演变是怎样的?
    • Go 的堆和栈
  • 面向对象
    • make 和 new 的区别
    • new(T) 和 &T{} 有什么区别?
  • 并发编程
    • Channel
    • Go语言 CSP 并发模型
    • GMP 模型原理
      • GMP 模型为什么要有 P ?
    • Go 协程池(goroutine pool)
    • Go语言常见的并发模式
    • Go并发实践:主动停止goroutine
  • 最佳实践
    • 发布Go语言模块
  • 软件包
    • 常用的GoLang包工具
    • Go的UUID生成
    • 现代化的命令行框架Cobra
    • 配置解析神器Viper
    • Go发送邮件gomail
    • Go反射框架Fx
    • NSQ消息队列的使用
    • Go爬虫框架colly
    • grpc-go 的安装和使用
Powered by GitBook
On this page
  • 发布Go语言模块
  • 代码仓库
  • 模块初始化
  • 发布步骤

Was this helpful?

  1. 最佳实践

发布Go语言模块

PreviousGo并发实践:主动停止goroutineNext常用的GoLang包工具

Last updated 1 year ago

Was this helpful?

发布Go语言模块

开发 Go 程序,我们经常引用第三方模块。那么,怎么发布自己编写的模块呢?

请注意,一个版本打过标签发布后就不能再修改了。因为 Go 工具链用第一个下载副本来做验证,两个副本不同,就会报安全错误。与其修改先前发布版本的代码,不如发布一个新版本。

代码仓库

Go 模块代码通常采用 Git 来管理,代码仓库可以直接托管到 Github 上。为了演示 Go 模块的发布步骤,我在 Github 上建了一个极小化模块: 。

模块初始化

代码仓库建好后还空空如也,我们先执行 go mod init 命令进行初始化(init 后面的参数是模块名):

go mod init github.com/leeyongit/goutilb

该命令在当前目录下创建了 go.mod 文件,用来保存模块元数据,内容大致如下:

module github.com/leeyongit/goutils
go 1.19

至此,我们已经得到一个合法的 Go 模块!只是它没有提供任何代码,所以还没啥卵用。不过没关系,我们现在就给它加点代码。在代码仓库下新建 version.go 源文件:

package goutils
const version = "v1.0.0"
func Version() string {
    return version
}

这段代码只提供一个函数,返回模块的版本号。麻雀虽小,五脏俱全,用来演示足矣。

发布步骤

Go 模块准备好后,只需简单几步,即可将其发布出去:

  1. 打开命令行并进入模块根目录;

  2. 执行 go mod tidy 命令,删除一些不必要的模块依赖;

    我们演示发布的模块没有引用任何依赖,因此这步可有可无;

  3. 执行测试用例,最后一次确认代码运行无误;

    go test 命令执行模块的单测用例,用例可以用 Go 语言的测试框架来写。我们演示的模块没有测试用例,因此这步也可以跳过。

  4. 执行 git tag 命令,用新版本号打标签;

# 提交代码
git add .
git commit -m "first version"
# 打标签
git tag v1.0.0

版本号必须符合模块版本命名规则,以便让用户知晓代码变更情况(接口是否兼容)。

  1. 将新标签推到原仓库(如 Github );

  2. 执行 go list 命令触发 Go 更新模块索引信息,确保新发布的模块可用;

GOPROXY=proxy.golang.org go list -m github.com/leeyongit/goutils@v1.0.0

注意到,我们在命令之前设置了 GOPROXY 环境变量,指定使用 proxy.golang.org 作为 Go 代理。这可以确保我们请求到官方代理,而不是各种加速镜像。

至此,我们的模块就成功发布了!跟其他模块一样,开发人员只要在代码中 import ,然后执行 go get 命令即可使用它。go get 命令可以指定模块版本,不指定则默认获取最新版本:

# 默认获取最新版本
go get github.com/leeyongit/goutils
# 获取指定版本
go get github.com/leeyongit/goutils@v1.0.0
leeyongit/goutils