Go client默认不走Artifactory代理,需手动配置GOPROXY=https://artifactory.example.com/artifactory/api/go/goproxy,并根据私有模块添加,direct;应使用virtual repo聚合local与remote源,确保local在前;7.45+版本才完整支持Go接口;注意GOINSECURE、GONOSUMDB及module path与repo key严格一致。

Go client 默认不走 Artifactory 代理,得手动配置 GOPROXY
Artifactory 支持 Go 代理,但 Go 工具链不会自动发现它——不像 npm 或 pip 那样能从 registry 域名推断出代理地址。你得显式告诉 go 命令用哪个地址。
常见错误现象:go get 仍然直连 proxy.golang.org 或失败报 no matching versions,其实请求根本没进 Artifactory 日志。
- 所有开发者机器和 CI 节点都必须设置
GOPROXY=https://artifactory.example.com/artifactory/api/go/goproxy(路径末尾/goproxy是 Artifactory Go repo 的固定后缀) - 如果公司有私有模块(比如
git.internal.company.com/myorg/lib),要加,direct到GOPROXY值末尾,否则go不会尝试解析go.mod里的replace或require私有路径 - 别设
GOPRIVATE来绕过代理——它只控制“是否跳过验证”,不改变请求流向;漏设GOPRIVATE反而会导致私有域名被代理拦截后 404
Artifactory 中 Go repo 类型选 remote 还是 virtual?
直接用 remote repo 指向官方 proxy 并不够:它只能缓存,不能聚合多个源(比如你自己的 local Go repo + 官方 proxy + 第三方私有 repo)。真正落地时几乎都得配 virtual。
使用场景:团队既要拉 github.com/gorilla/mux,又要推/拉内部 company.com/go/auth,还得支持 go list -m all 统一解析。
-
virtualrepo 必须把remote(指向https://proxy.golang.org)和local(存内部 module)都加进去,顺序很重要:local 在前,确保go get company.com/go/auth优先走本地而非被 remote 拦截 - Artifactory 7.45+ 才完整支持 Go 的
/list和/info接口,老版本用virtual会卡在go mod download阶段;查版本用curl -s https://artifactory.example.com/artifactory/api/system/version | jq .version - 别给
virtualrepo 开启 “Blacked out” 或 “Excluded Patterns”,Go 的@v/v1.2.3.info请求路径含@,容易被误拦截
go mod download 失败但 Artifactory 日志显示 200?查 GOINSECURE 和证书
Artifactory 用 HTTPS,但有些内网环境用的是自签名证书或内部 CA。Go client 默认不信任这些,会静默失败并 fallback 到 direct 模式,导致看起来像“没走代理”。
典型表现:go mod download 卡住几秒后报 missing github.com/xxx/go.mod,但 Artifactory access.log 确实有 200 记录——说明请求到了,但 Go 拒绝接受响应体。
- 先确认是否真走代理:运行
go env GOPROXY和go env GONOSUMDB,后者必须包含你的私有域名(如company.com/go),否则 checksum 验证失败会中断下载 - 如果 Artifactory 域名是 HTTP 或自签名 HTTPS,设
GOINSECURE=artifactory.example.com;但仅限内网,切勿在公网环境用 - 更稳妥的方式是把内部 CA 证书加到系统信任库,再让 Go 复用:Linux 上执行
update-ca-certificates,macOS 用钥匙串导入后设GODEBUG=x509ignoreCN=0(仅调试用)
私有 module 发布后 go get 找不到?检查 go.mod 里 module 名和 Artifactory 路径是否一致
Go 的 module path 不是 URL,而是逻辑标识符。Artifactory 不会自动映射 git.internal.company.com/mylib 到 https://artifactory.example.com/artifactory/go-local——它只按请求路径匹配 repo。
最容易被忽略的点:你 push 了代码,也建了 local repo,但 go get git.internal.company.com/mylib 仍 404。
- module path 必须和 Artifactory repo key 完全一致,比如 repo 叫
go-internal,那go.mod第一行就得是module git.internal.company.com/mylib,不能写成company.com/go/mylib - 发布命令要用
go publish(Go 1.22+)或手动curl -u user:pass -X PUT ...上传.zip和.mod文件到/artifactory/api/go/go-internal/v2/...路径,不能只 push git - Artifactory 的 Go local repo 必须开启 “Enable Go API”(在 repo 编辑页底部),否则不响应
/@v/list等端点
路径匹配比想象中更严格,少一个斜杠、大小写错位、甚至 module 名里多空格都会导致整个代理链断裂。










