
Go 语言支持通过自定义域名(如 example.com)替代原始仓库地址(如 github.com/user/repo)进行模块导入,从而避免因迁移托管平台而修改所有 import 路径。其核心依赖 HTTP 重定向与 Go 的 go get 导入协议解析机制。
go 语言支持通过自定义域名(如 `example.com`)替代原始仓库地址(如 `github.com/user/repo`)进行模块导入,从而避免因迁移托管平台而修改所有 import 路径。其核心依赖 http 重定向与 go 的 `go get` 导入协议解析机制。
在 Go 模块生态中,go get 并非简单地按 URL 下载代码,而是遵循一套标准的导入路径发现协议(Import Path Discovery Protocol):当执行 go get example.com/repo 时,go 工具会向 https://example.com/repo?go-get=1 发起 GET 请求,并期望服务端返回包含特定 <meta> 标签的 HTML 响应,用以声明真实代码仓库的位置与协议类型。
要成功将 example.com/repo 映射到 github.com/user/repo,需完成两个关键步骤:
✅ 1. 配置 DNS CNAME 记录
将你的自定义域名(如 goji.io)通过 CNAME 记录指向 GitHub Pages 域名(如 goji.github.io),确保 curl -I https://goji.io 可正常访问静态站点。注意:若使用 HTTPS,需确保证书覆盖该域名(GitHub Pages 自动为 *.github.io 提供证书,但自定义域名需手动启用 HTTPS)。
✅ 2. 提供符合 Go 协议的 HTML 响应
在 https://goji.io/(或子路径如 /repo)返回的 HTML 中,嵌入如下 <meta> 标签(注意路径层级匹配):
<meta name="go-import" content="goji.io go git https://github.com/goji/goji"><meta name="go-source" content="goji.io https://github.com/goji/goji https://github.com/goji/goji/tree/master{/dir} https://github.com/goji/goji/blob/master{/dir}/{file}#L{line}"><p>goji.io — Go web framework.</p>
-
go-import是必需项:格式为<import-path><vcs><repo-root></repo-root></vcs></import-path>,其中vcs可为git/hg/svn;repo-root必须是可被go工具直接克隆的地址。 -
go-source为可选项,用于支持go doc和 IDE 跳转源码。
⚠️ 注意事项:
- 所有响应必须返回 HTTP 状态码
200 OK(301/302 重定向不生效,go get不跟随跳转);- 内容类型应为
text/html; charset=utf-8;- 路径需精确匹配:
go get goji.io/v3要求https://goji.io/v3?go-get=1返回对应<meta name="go-import" content="goji.io/v3 ...">;- 若托管于 GitHub Pages + Jekyll,需禁用
jekyll-redirect-from等插件对?go-get=1查询参数的干扰,推荐使用纯静态 HTML 或自定义_layouts/go-import.html。
完成配置后,即可直接运行:
go get goji.io # 等价于 go get github.com/goji/goji
这种机制本质是服务端声明式映射,而非 DNS 或 CDN 层面的透明代理。它赋予你完全的托管平台解耦能力——未来迁移到 GitLab、Gitea 或私有 Git 服务器时,只需更新 <meta> 标签中的 repo-root,所有下游用户的 import "goji.io" 和 go get 命令保持不变。










