前言
截止到 go1.13, go 官方推出的包管理工具 go module 已经发布三个版本了,网上也有很多文章介绍如何使用 go module(推荐观看附录中Go夜读的视频和官方Wiki),但是大部分都是讲如何引用别人的 go module 模块,鲜有提到如何发布自己的 go module 包的文章。本文将主要介绍如何“优雅”地发布自己的 go module 模块。
本文的代码和命令均在 ubuntu 19.10 中运行,go 的版本为 1.13.5
pkg.go.dev简介
go.dev 是go官方团队于2019年11月上线的集合go开发资源的网站,包括一些学习课程和一些go的案例,当然最重要的就是提供了go的第三方包的检索功能。没错,他就是用来取代原来的godoc.org的,现在godoc.org上也有提示提醒用户迁移到pkg.go.dev。在这篇文章中,我们将把go module模块发布到pkg.go.dev。
BTW,在我写这篇文章的时候(2020.02.19),go官方刚好也宣布了go.dev不久将开源。
发布第一个版本
这次要发布的代码放在github,所以新建一个项目叫how-to-release-go-module, 新增hello.go 文件
为hello.go添加两个方法和相关注释
package pkg
import "fmt"
// Hello says hello.
func Hello() {
fmt.Println("Hello go mod!")
}
// Bye says bye.
func Bye() {
fmt.Println("Bye go mod!")
}
执行 go mod init 生成go.mod文件
go mod init
go: creating new go.mod: module github.com/YouEclipse/how-to-release-go-module
内容如下:
module github.com/YouEclipse/how-to-release-go-module
go 1.13
我们把代码push 到远端分支,看起来好像第一个版本就发布完毕了。我们打开pkg.go.dev搜索一下github.com/YouEclipse/how-to-release-go-module这个包,却返回未找到这个包。这是为何?
其实在go.dev的about中说的很清楚了,只有通过proxy.golang.org下载包的时候,module才会自动同步到pkg.go.dev。
To add a package or module, simply fetch it from proxy.golang.org.
但是,实际上,proxy.golang.org 国内基本上是无法访问的,如果我们使用 goproxy.cn,也一样能够同步,我没有研究goproxy的源码,但是我和goproxy的作者确认过,goproxy的推算行为会用到 proxy.golang.org,所以使用goproxy.cn作为代理也是可行的。
我们可以随便建一个