不要将你的 Go 代码与 GitHub 绑定
艾恩·剑桥 家庭博客 分类 2026年9月27日 Go 的一个好处是你可以用获取代码的位置命名空间来组织你的代码。这意味着如果你在 http://github.com/thetrueares/boneclone 托管你的 Go 代码,那么你就会有这一行 import "github.com/thetrueares/boneclone",Go 会使用 git 获取它。这使得报告开源库的错误变得非常简单,也使得获取和分发 Go 库变得非常容易,而无需集中式的包管理系统。对于很多人来说,这实际上就是 git 托管的位置,但这也有一些缺点,因此你应该使用自己的自定义域名,下面我将解释原因。 问题 使用你 git 托管位置的主要问题是你的代码现在与托管提供商绑定。也就是说,如果你将 git 托管迁移到 GitLab,那么你就必须更改你的代码!否则,你将获取旧版本。这可能会导致你无法更改 git 托管提供商,因为切换的开销太大。因此,你实际上最终将代码绑定到 GitHub。这听起来完全疯狂,但在 Go 社区中这几乎是事实。我看到这个问题成为一家同时使用 GitLab、GitHub 和 Azure Devops 的公司的一个巨大问题,因为对他们来说,改变代码的位置是一个庞大的任务,他们没有“时间”,所以在三个平台上操作对他们来说更简单。这就是我构建 Boneclone 的原因,以便在多个 git 托管平台之间同时处理代码骨架的复制。因此,这个问题实际上让公司花了钱,因为他们不得不同时支付三个托管服务的费用。 解决方案 解决方案是使用自定义域名,如 go.iain.rocks、go.uber.org、go.mongodb.org 等。这允许你只需更改这些域名的指向。例如,go.iain.rocks/boneclone 指向 github.com/thetrueares/boneclone,如果我迁移到 GitLab,对最终用户没有任何改变,安装命令是一样的。在我看来,每个使用 Go 的商业软件开发团队都应该使用自定义域名来命名他们的内部库和包。这是避免任何无意义结合的简单方法。以下是我的配置副本,以便你可以为你的项目设置。 Nginx.conf server { server_name go.iain.rocks; root /var/www/go.iain.rocks; index index.html; location / { # 检查查询字符串是否不包含 'go-get=1'。 # '~' 是用于区分大小写的匹配。 if ($args !~ go-get=1) { # 这是一个人类访问者。 永久重定向到 GitHub。 # $request_uri 将是路径,例如 /boneclone return 301 https://github.com/that-guy-iain$request_uri; } # 如果它是 Go 工具(带有 ?go-get=1),像以前一样服务 HTML 文件。 try_files $uri $uri/ =404; } # --- 你从 Certbot 处的 SSL 配置应保留在这里 --- listen 443 ssl; listen [::]:443 ssl; ssl_certificate /etc/letsencrypt/live/go.iain.rocks/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/go.iain.rocks/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } # HTTP 到 HTTPS 重定向块也应保留。 server { listen 80; listen [::]:80; server_name go.iain.rocks; return 301 https://$host$request_uri; } index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="go-import" content="go.iain.rocks/boneclone git https://github.com/that-guy-iain/boneclone"> <meta name="go-source" content="go.iain.rocks/boneclone https://github.com/that-guy-iain/boneclone https://github.com/that-guy-iain/boneclone/tree/master{/dir} https://github.com/that-guy-iain/boneclone/blob/master{/dir}/{file}#L{line}"> </head> <body> </body> </html>
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡