通配路由让你用一条规则覆盖自定义域名前缀下的所有仓库,无需逐个注册。
前提条件
- Pro 账户(运行
gvu subscribe升级) - 已配置 DNS CNAME 的自定义域名
- 已安装
gvuCLI — 参见 快速开始
注意: 通配路由不支持默认的
gomod.io域名,仅适用于自定义域名。
Repo 通配(W1)
适用于同一 GitHub 组织或同一路径前缀下有多个仓库的场景。
语法
gvu add '<域名>/<前缀>/*' 'https://<主机>/<组织>/*.git'
Shell 引号:
*在 shell 中必须用引号包裹以防止 glob 展开。对包含*的参数使用单引号('...')。
vanity path 中的 * 匹配任意单个路径段。repo URL 中的 * 会被匹配到的路径段替换。
示例
# 覆盖 go.mycorp.com/dept1/ 下的所有仓库
gvu add 'go.mycorp.com/dept1/*' 'https://github.com/dept1/*.git'
创建此规则后,go.mycorp.com/dept1/ 下的任何 go get 请求都会自动解析:
import "go.mycorp.com/dept1/auth" // → github.com/dept1/auth
import "go.mycorp.com/dept1/config" // → github.com/dept1/config
import "go.mycorp.com/dept1/utils" // → github.com/dept1/utils
无需逐个添加路由 — 新仓库立即生效。
Subdir 通配(W2)
适用于 monorepo 中包含多个子目录 Go 模块的场景。结合 Go 1.25+ 的 subdir 支持,自动解析所有子包。
语法
gvu add <域名>/<前缀>/<仓库> https://<主机>/<组织>/<仓库>.git '--subdir=*'
--subdir 中的 * 会被请求中的子包路径段替换。
示例
# 覆盖 monorepo 中的所有子包
gvu add go.mycorp.com/dept1/mono https://github.com/dept1/mono.git '--subdir=*'
创建此规则后:
import "go.mycorp.com/dept1/mono/api" // → github.com/dept1/mono (subdir: api)
import "go.mycorp.com/dept1/mono/config" // → github.com/dept1/mono (subdir: config)
import "go.mycorp.com/dept1/mono/worker" // → github.com/dept1/mono (subdir: worker)
Go 1.25+ 工具链会 clone 仓库并从匹配的子目录中读取 go.mod。
优先级规则
当多条规则可能匹配同一请求时,解析器按以下优先级排序:
| 优先级 | 规则类型 | 示例 |
|---|---|---|
| 1(最高) | 精确匹配 | go.mycorp.com/dept1/auth(精确路由) |
| 2 | Subdir 通配(W2) | go.mycorp.com/dept1/mono + --subdir=* |
| 3 | Repo 通配(W1) | go.mycorp.com/dept1/* |
示例:优先级实战
假设有以下规则:
# 精确路由(优先级 1)
gvu add go.mycorp.com/dept1/auth https://github.com/dept1/auth-v2.git
# Repo 通配(优先级 3)
gvu add 'go.mycorp.com/dept1/*' 'https://github.com/dept1/*.git'
go get go.mycorp.com/dept1/auth→ 解析到auth-v2(精确匹配优先)go get go.mycorp.com/dept1/config→ 解析到github.com/dept1/config(通配匹配)
配额与限制
- 每条通配路由占 1 个 Pro 配额(共 50 个)
- 通配路由需要自定义域名 — 不支持
gomod.io - Repo 通配(W1)和 Subdir 通配(W2)互斥,每条路由只能选一种
- repo URL 中只允许一个
*
常见场景
场景 A:组织下 20+ 仓库
无需逐个添加:
# 一条规则覆盖所有现有和未来的仓库
gvu add 'go.mycorp.com/platform/*' 'https://github.com/mycorp-platform/*.git'
场景 B:包含多个 Go 模块的 Monorepo
# 一条规则覆盖所有子包
gvu add go.mycorp.com/infra/core https://github.com/mycorp/core.git '--subdir=*'
场景 C:混合使用精确路由和通配路由
# 通配规则覆盖大部分仓库
gvu add 'go.mycorp.com/team/*' 'https://github.com/myteam/*.git'
# 用精确路由覆盖特定仓库(优先级更高)
gvu add go.mycorp.com/team/legacy https://gitlab.com/myteam/legacy.git
gvu add go.mycorp.com/team/fork https://github.com/upstream/fork.git
故障排查
go get 报错 “repository not found”
通配规则匹配到的仓库在 Git 托管平台上不存在。将 * 替换为实际包名来验证仓库 URL:
# 如果 go get go.mycorp.com/dept1/foo 失败,检查:
git ls-remote https://github.com/dept1/foo.git
gvu add 拒绝通配路由
常见原因:
| 错误 | 原因 | 解决方法 |
|---|---|---|
WILDCARD_PRO_ONLY | 非 Pro 账户 | 运行 gvu subscribe |
INVALID_WILDCARD | * 组合无效 | 确保 * 在路径末尾(/*)且在 repo URL 中 |
CUSTOM_DOMAIN_REQUIRED | 使用了 gomod.io | 改用自定义域名 |
通配路由已创建但子包无法解析
确保 GOPRIVATE 包含你的自定义域名:
go env -w GOPRIVATE=go.mycorp.com
详见通配路由。