Go package 发布
Table of Contents
1. 发布到 pkg.go.dev 1
pkg.go.dev 的数据是从 proxy.golang.org 下载的,定期监控 Go Module Index 然后添加到 pkg.go.dev。
如果没有更新,以 github.com/zhangjie2012/yo-kit
为例,以下三种方法均可,第一种更快:
- 打开
https://pkg.go.dev/github.com/zhangjie2012/yo-kit
然后点击Request "github.com/zhangjie2012/yo-kit"
按钮 - 向 proxy.golang.org 发出模块版本请求,比如
https://proxy.golang.org/github.com/zhangjie2012/yo-kit/@v/main.info
- 通过命令行下载该 package
GOPROXY=https://proxy.golang.org GO111MODULE=on go get github.com/zhangjie2012/yo-kit@main
然后就可以在 https://pkg.go.dev/github.com/zhangjie2012/yo-kit 中看到文档了。
proxy.golang.org 的说明
Go 模块的全局镜像。当然国内有七牛的 https://goproxy.cn/ 官方的 https://goproxy.io/zh/ 可用,是不是直接把 proxy.golang.org 作为上游镜像,我不太确定。
为什么提交了新的改动,但是 go get -u
或者 go list -m --version
中没有出现呢?
- 有缓存,正常情况 30 分钟左右后生效
- 如果想要快速生效(1分钟左右),需要做一个版本发布(新建一个语义化的版本号,然后在 get 后面指定)
- 如果不想使用 GOPROXY,package 本身是公开的,则可以通过设置
GOPROXY=direct
来跳过 PROXY,直接从 repo 拉取
2. 从 go.dev 移除
- 在 go.mod 中添加
retract
指令,查看 https://go.dev/blog/go116-module-changes 文档中的 Module retraction 小节 - 向 Go 开发团队提出 request
两种方式其实都挺麻烦的。
3. 文档
pkg.go.dev 是根据代码中的文档(注释)自动生成的(godoc 工具自动提取),书写规范:Go Doc Comments。
4. 最佳实践
- 拥有一个
go.mod
文件 Go 1.11 后引入了官方的模块管理工具go mod
- 可分发 LICENSE 使用少三方使用限制的开源协议,你的项目中根目录下需要有一个
LICENSE
文件 - Tagged 版本 解析 package 时,优先使用 tag 标记的版本,如果没有 tag,则会寻找最新的提交记录(可读性差)
- 版本号定义规范:https://semver.org/
- Stable 版本
v0
是实验性版本,v1 或已上会被认为是个稳定版本,破坏性的更新会在大版本中;稳定版本之后的次要版本 通常认为是兼容的。
LICENSE 如何选择?
- https://docs.github.com/cn/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository
- https://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html
我一般选择 MIT 或者 Apache。
对于版本管理?
我的理解是,如果是自己使用没太必要用 tag 来维护,比较麻烦,全部推 main 分支即可。但如果考虑开源或者存在不兼容的情况, 是需要严格的版本管理机制的。
5. 自动构建
Github Actions 中添加一个 workflow,其实是个 git hook,在每次提交的时候会触发自动构建。
构建成功的会有一个徽标,你可以放到 README.md 中,看起来酷酷的。
6. go.dev 的徽标
以前 https://github.com/golang/go/issues/36982 不支持,用第三方的 https://shields.io 来替代。目前已经支持了:https://pkg.go.dev/badge/