Go包维护者必读:如何让你的Go包更易被发现、文档更专业?

请点击上方蓝字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 通常能自动检测包的源码位置,并在文档中提供从符号到其源码定义的链接。如果你的包源码链接未能正确显示,可以尝试:

  1. go-source meta 标签: 在你的网站上添加符合特定格式[7]的 go-source meta 标签,这有助于 pkg.go.dev 解析源码位置(尽管该格式未考虑版本控制)。

  2. 贡献模式: 如果上述方法无效,你需要将你的仓库或代码托管站点模式添加到 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技能,让你的开源项目闪耀社区! ✨

img{512x368}

参考资料

[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

点击下面标题,阅读更多干货!

-  聊聊godoc、go doc与pkgsite

小厂内部私有Go module拉取方案

选择正确的Go Module Path

一文告诉你当module path为main时执行go test失败的真正原因

Go包构建:专家也未必了解的文件选择细节

小厂内部私有Go module拉取方案3

小厂内部私有Go module拉取方案(续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值