通配路由让你用一条规则覆盖自定义域名前缀下的所有仓库,无需逐个注册。

前提条件

  • Pro 账户(运行 gvu subscribe 升级)
  • 已配置 DNS CNAME 的自定义域名
  • 已安装 gvu CLI — 参见 快速开始

注意: 通配路由不支持默认的 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(精确路由)
2Subdir 通配(W2)go.mycorp.com/dept1/mono + --subdir=*
3Repo 通配(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

详见通配路由