GCP Artifact Registry私有Go模块本地拉取返回404错误求助
检查模块版本标签是否符合Go规范
Go模块要求版本标签必须带v前缀,格式为vX.Y.Z(比如v1.0.0、v2.1.3),且标签必须推送到git仓库。如果Cloud Build上传时使用的标签不符合这个规范(比如无v前缀、格式错误),Artifact Registry不会生成对应的可拉取版本,导致拉取时返回404。可以执行git tag查看本地标签,对比Artifact Registry中显示的版本号是否一致。验证Go环境变量配置
确保Go的环境变量正确指向私有仓库,避免走公共代理:- 执行
go env | grep -E "(GOPROXY|GOPRIVATE|GONOSUMDB)"查看当前配置 - 需将Artifact Registry的仓库域名加入
GOPRIVATE,例如:go env -w GOPRIVATE=us-central1.pkg.dev/your-project/your-repo - 将私有仓库的代理地址加入
GOPROXY:go env -w GOPROXY=https://us-central1.pkg.dev/your-project/your-repo/proxy,direct - 禁用私有模块的校验和数据库:
go env -w GONOSUMDB=us-central1.pkg.dev/your-project/your-repo/*
- 执行
确认本地认证与Artifact Registry的关联
虽然已登录GCP CLI,仍需验证令牌有效性和Go的认证使用:- 执行
gcloud auth print-access-token获取令牌,确认令牌未过期 - 临时设置环境变量强制使用该令牌:
export GOPROXY=https://us-central1.pkg.dev/your-project/your-repo/proxy export GONOSUMDB=us-central1.pkg.dev/your-project/your-repo/* export GO111MODULE=on export GOPRIVATE=us-central1.pkg.dev/your-project/your-repo export GIT_CONFIG_GLOBAL=/dev/null go get -u your-module-path@version - 检查
~/.netrc或~/.config/go/netrc文件,确保没有冲突的认证条目干扰Go拉取模块
- 执行
核对模块路径与Artifact Registry的一致性
GCP Artifact Registry对路径大小写敏感,需确保本地代码中引用的模块路径与Artifact Registry中显示的完全一致(包括大小写、仓库ID、区域、项目ID)。例如,若Artifact Registry中模块路径为us-central1.pkg.dev/my-proj/my-repo/mymod,本地引用时不能写成US-Central1.pkg.dev/My-Proj/My-Repo/MyMod。验证Artifact Registry中的模块元数据
进入Artifact Registry的模块详情页,确认:- 目标版本已存在,且对应的
go.mod文件正确上传 - 模块的
module声明与本地引用的路径完全一致 - 版本的元数据文件(如
go.mod、go.sum)没有损坏
- 目标版本已存在,且对应的
检查Cloud Build的构建逻辑
确认Cloud Build的步骤是否正确生成并推送符合规范的模块版本:- 构建过程中是否执行了
git tag并推送标签到远程仓库 - 是否使用
go list -m验证模块路径正确性 - 上传模块的命令是否指定了正确的仓库区域和路径
- 构建过程中是否执行了
尝试明确指定版本拉取
避免让Go自动解析版本,手动指定版本号执行拉取:go get your-module-path@v1.0.0如果仍返回404,说明该版本未被正确上传到Artifact Registry,需检查Cloud Build的上传逻辑。
内容的提问来源于stack exchange,提问作者GoCoder

