发布Go语言模块

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

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

代码仓库

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

模块初始化

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

1
go mod init github.com/fasionchan/goutils

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

1
2
3
module github.com/fasionchan/goutils

go 1.19

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

1
2
3
4
5
6
7
package goutils

const version = "v1.0.0"

func Version() string {
	return version
}

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

发布步骤

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

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

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

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

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

    1
    
    go test ...
    

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

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

    1
    2
    3
    4
    5
    
    # 提交代码
    git commit -m "first version"
    
    # 打标签
    git tag v1.0.0
    

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

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

    1
    
    git push origin v1.0.0
    
  6. 执行 go list 命令触发 Go 更新模块索引信息,确保新发布的模块可用;

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

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

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

1
2
3
4
5
# 默认获取最新版本
go get github.com/fasionchan/goutils

# 获取指定版本
go get github.com/fasionchan/goutils@v1.0.0

【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注: