请点击上方蓝字TonyBai订阅公众号!
大家好,我是Tony Bai。
对于 Go 开发者而言,pkg.go.dev 不仅仅是一个查找包文档的网站,更是展示和推广自己辛勤成果的重要平台。理解其运作机制、掌握其使用技巧,并遵循其倡导的最佳实践,能显著提升你的 Go 包的专业度、可见性和社区友好度。本文将基于官方信息,和大家一起挖掘一下 pkg.go.dev 的宝藏知识,包括核心功能和关键建议。
让你的包“入住”pkg.go.dev
pkg.go.dev 的数据来源于官方的 Go Module Proxy (proxy.golang.org),并通过 Go Module Index (index.golang.org) 定期监测新的包版本。如果你的包尚未被收录,可以通过以下任一方式主动添加:
直接请求收录: 访问你的包在 pkg.go.dev 上对应的 URL (即使它显示“Not Found”),例如 https://pkg.go.dev/example.com/my/module,然后点击页面上的 “Request” 按钮(如下图所示)。
触发 Proxy 请求: 向 proxy.golang.org 发送一个符合 Go Module Proxy 协议[1] 的请求。例如,请求特定版本的 .info 文件:
$curl https://proxy.golang.org/example.com/my/module/@v/v1.0.0.info
使用 go get 命令: 通过 go get 命令下载你的包(确保 GOPROXY 指向官方代理),这也会触发代理获取该模块:
$GOPROXY=https://proxy.golang.org GO111MODULE=on go get example.com/my/module@v1.0.0
一旦 proxy.golang.org 索引了你的模块版本,pkg.go.dev 通常会在几分钟内获取并展示其文档。
管理你的包版本:撤回不推荐的版本
如果你希望从 pkg.go.dev 以及 go 命令的解析结果中隐藏某个模块的特定版本(例如,修复了严重 Bug 或安全漏洞后),应当使用 retract 指令。这需要在你的 go.mod 文件中添加 retract 指令,并发布一个新的模块版本。
// go.mod
module example.com/my/module
go 1.18
retract (
v1.0.0 // 解释为何撤回此版本
[v1.0.1, v1.0.5] // 也可以撤回一个版本范围
)
详细信息请参考 Go 官方博客文章 New module changes in Go 1.16[2] 和 modules reference[3]。
关键点:
即使是最新版本也可以被撤回。
已发布的版本(包括被撤回的版本)无法被修改或重用。
如果源码仓库或域名已无法访问,导致无法通过发布新版本来撤回,可以向 pkgsite 团队提交请求[4]来隐藏所有版本文档。但请注意,这仅隐藏 pkg.go.dev 上的文档,模块本身仍可通过 go get 获取,除非它被正确撤回。
文档是如何生成的?
pkg.go.dev 从 Go Module Mirror (proxy.golang.org//@v/.zip) 下载 Go 源码,并基于源码中的注释生成文档。
遵循 godoc 指南: 编写文档时,应遵循为 godoc 工具制定的文档编写指南[5]。
首句摘要至关重要: 包注释的第一句话应提供对包功能的良好总结。pkg.go.dev 会索引这句话并在搜索结果中显示它,直接影响用户对你包的第一印象。
理解 Build Context (构建上下文)
Go 语言允许包在不同的操作系统 (GOOS) 和 CPU 架构 (GOARCH) 组合(称为“Build Context”,如 linux/amd64)下表现不同,甚至拥有不同的导出符号。
单一上下文: 如果包仅存在于一个 Build Context(如 syscall/js 仅用于 js/wasm),pkg.go.dev 会在文档右上角显示该上下文(如下图)。
多上下文差异: 如果包在不同上下文中存在差异,pkg.go.dev 会默认显示一个,并提供下拉菜单供用户切换查看其他支持的上下文(如下图)。
通用包: 对于在所有上下文中表现一致的包,则不显示上下文信息。
支持范围: pkg.go.dev 仅考虑有限的一部分[6] Build Context。如果你的包仅存在于不受支持的上下文中,其文档可能不会显示。
源码链接:连接文档与定义
pkg.go.dev 通常能自动检测包的源码位置,并在文档中提供从符号到其源码定义的链接。如果你的包源码链接未能正确显示,可以尝试:
go-source meta 标签: 在你的网站上添加符合特定格式[7]的 go-source meta 标签,这有助于 pkg.go.dev 解析源码位置(尽管该格式未考虑版本控制)。
贡献模式: 如果上述方法无效,你需要将你的仓库或代码托管站点模式添加到 pkgsite 的配置中。参考如何贡献 pkg.go.dev[8] 并提交一个 CL,向 internal/source[9] 包添加模式。
遵循最佳实践:提升你的包质量
pkg.go.dev 会展示关于 Go 包和模块的一些关键细节,旨在推广社区的最佳实践。关注这些细节,能让你的包更受信任,更易于被其他开发者采用:
拥有 go.mod 文件: Go 模块系统是官方推荐的标准依赖管理方案。一个模块版本由其根目录下的 go.mod 文件定义。
使用可再分发许可证 (Redistributable license): 这类许可证(如 MIT, Apache 2.0, BSD 等)对软件的使用、修改和再分发限制最小。pkg.go.dev 有其许可证策略[10]来判断许可证是否可再分发。
打上版本标签 (Tagged version): go get 命令默认优先解析打了标签的版本 (遵循 Semantic Versioning[11])。没有标签时,会查找最新的 commit。使用版本标签能为导入者提供更可预测的构建。参考 Keeping Your Modules Compatible[12]。
达到稳定版本 (Stable version): v0.x.y 版本的项目被认为是实验性的。当项目达到 v1.0.0 或更高版本时,即为稳定版本。这意味着后续的破坏性变更必须在新的主版本中进行(如 v2.0.0)。稳定版本给予开发者信心,在升级到最新的次要版本或修订版本时不会遇到破坏性变更。参考 Go Modules: v2 and Beyond[13]。
锦上添花:徽章、链接与快捷键
创建徽章 (Badge): 使用徽章生成工具[14]为你的项目创建一个 pkg.go.dev 徽章,可以放置在 README 或项目网站上,方便用户快速访问你的包文档。
添加自定义链接: 你可以在 README 文件和包文档中添加自定义链接,这些链接会显示在 pkg.go.dev 页面上。下面是添加links的示例:
# The Links Repo
This repo demonstrates pkgsite links.
## Links
- [pkg.go.dev](https://pkg.go.dev "pkg.go.dev")
- [this file](README.md "this file")
## How it works
Links are taken from a README heading named "Links".
展示的页面上的链接如下:
键盘快捷键: 在包文档页面输入 ? 可以查看可用的键盘快捷键,方便导航。
小结
pkg.go.dev 是 Go 生态中连接包作者与使用者的重要桥梁。通过理解其运作方式,精心准备你的包(包括清晰的文档、规范的版本管理、合适的许可证以及遵循最佳实践),你的 Go 包将更容易被发现、理解和信赖。
提升Go包影响力,你有什么独门秘诀?
pkg.go.dev 为我们提供了展示和推广Go包的官方平台。除了文中提到的这些技巧和最佳实践,你在维护和推广自己的Go包时,还有哪些特别的心得体会或踩过的“坑”? 比如,你是如何编写更吸引人的包描述?如何处理社区的Issue和PR?或者有什么让你的包在众多选择中脱颖而出的好方法?🤔
热烈欢迎在评论区分享你的宝贵经验,让我们共同打造更繁荣、更高质量的Go包生态! 👇
如果你不仅希望自己的Go包拥有专业的文档和良好的可见性,更渴望深入理解Go语言的设计哲学、掌握高级特性、提升项目工程化水平。
那么,我的 「Go & AI 精进营」知识星球 将是你的理想伙伴!在这里,我们不仅探讨语言细节,更有【Go进阶课】、【Go原理课】等内容助你提升项目构建与维护能力。我会亲自为你解答Go开发中的各种疑难,你还能与众多优秀的Gopher交流思想、碰撞火花,共同探索Go在各个领域的最佳实践,包括如何更好地参与和贡献开源社区。
现在就扫码加入,与我们一起精进Go技能,让你的开源项目闪耀社区! ✨

参考资料
[1]
Go Module Proxy 协议: https://pkg.go.dev/cmd/go/#hdr-Module_proxy_protocol
[2]New module changes in Go 1.16: https://go.dev/blog/go116-module-changes#module-retraction
[3]modules reference: https://go.dev/ref/mod#go-mod-file-retract
[4]提交请求: https://go.dev/s/pkgsite-package-removal
[5]文档编写指南: https://go.dev/blog/godoc
[6]有限的一部分: https://go.googlesource.com/pkgsite/+/master/internal/build_context.go#29
[7]特定格式: https://github.com/golang/gddo/wiki/Source-Code-Links
[8]如何贡献 pkg.go.dev: https://go.googlesource.com/pkgsite#contributing
[9]internal/source: https://go.googlesource.com/pkgsite/+/refs/heads/master/internal/source/source.go
[10]许可证策略: http://pkg.go.dev/license-policy
[11]Semantic Versioning: https://semver.org/
[12]Keeping Your Modules Compatible: https://go.dev/blog/module-compatibility
[13]Go Modules: v2 and Beyond: https://go.dev/blog/v2-go-modules
[14]徽章生成工具: https://pkg.go.dev/badge
点击下面标题,阅读更多干货!