Go 代码别被 GitHub 绑死

Don't couple your Go code to GitHub

Go 语言通过 URL 命名空间获取代码的特性虽然便捷,却容易让项目与 GitHub 深度耦合。一旦你想迁移到 GitLab 或 Azure DevOps,就必须修改所有依赖代码,这种高昂的切换成本甚至迫使一些公司同时维护多个托管平台,白白浪费资金。文章作者 Iain Cambridge 指出,解决之道是使用自定义域名(如 go.iain.rocks)来解耦代码与托管服务。通过配置 Nginx 和 HTML 元数据,你可以让域名指向任意 Git 仓库,无论后端如何迁移,用户的安装命令始终不变。对于任何商业 Go 开发团队而言,采用自定义域名是避免被单一平台锁定的最佳实践。

这听起来完全荒谬,但这却是 Go 社区中几乎成为事实的标准做法。
  1. p4bl0

    没错,但得小心你用的域名。因为 VeriSign 可能会单方面决定把你的域名连同成千上万个其他域名一起删掉 [1],到时候你就得从头再来了……

    [1] https://neil.fraser.name/news/2026/09/03/

  2. thih9

    > 在我看来,每个使用 Go 进行商业软件开发的团队,都应该使用自定义域名来命名空间化其内部库和包。

    我觉得上面的话里可以把“Go”去掉,也就是说,同样的道理也适用于其他技术栈。

    甚至在代码注释中使用 GitHub 域名链接,长期来看也会出问题。比如当发生迁移时,这些链接就会指向空无一物。

  3. dewey

    > 也就是说,如果你把 Git 托管迁移到 GitLab,你就得改代码!

    你完全可以在 go.mod 文件里加一行 "replace github.com/example/example => gitlab.com/example/example",一切就能继续正常工作。这似乎是对一个根本不重要的问题做了过早的优化。

  4. okanat

    正如 [^1] 所说:

    > 在花了几年时间在两个方向上折腾 FFI 之后,我得出的结论是:Go 唯一靠谱的边界就是网络边界。

    看来这一点也延伸到了包管理器上。Go 程序唯一靠谱的边界是 socket。Go 包管理器(如果我们能称之为包管理器的话)唯一靠谱的边界则是域名和 DNS 服务器(你自己的,或者像 gopkg.in 那样别人的)。

    [^1]: https://fasterthanli.me/articles/lies-we-tell-ourselves-to-k...

  5. st3fan

    当一家公司倒闭,其域名变成孤儿域名时,情况就非常糟糕了。下一个抢注它的人就会接管源代码,而其他人却还在依赖它。我们在其他生态系统中已经见过很多次这种情况了。这是一个非常糟糕的局面。

    建议把你的包移到自己的域名下是坏主意。你绝不可能像微软那样有能力一直续费域名。人生没有 guarantees,但我敢保证,当你公司倒闭时,域名绝对是最后才会让你想到的东西。

同日更多故事

2026-09-27