Git非根目录下Go包版本异常问题求助
这不是Go包管理系统的Bug,是模块版本标签的匹配规则导致的,按以下步骤就能解决:
核心原因
Go模块的版本标签需要和模块路径一一对应。你的go子目录如果是独立的Go模块(应该有自己的go.mod),根目录打的v1.0.1标签只会关联根模块,不会自动映射到子目录模块。go get时下载根模块是因为Go依赖解析会遍历仓库结构,确认子模块的存在,但根模块本身没有可执行的Go代码,所以无法直接使用。
解决步骤
给子模块打专用版本标签
在仓库根目录执行以下命令,给go子模块打带路径前缀的语义化标签:git tag go/v1.0.1 git push origin go/v1.0.1这种
[子目录路径]/[版本号]的标签格式是Go识别子模块版本的标准方式,打完后pkg.go.dev和go get就能正确关联到子目录模块的v1.0.1版本。验证修复效果
执行go get github.com/and3rson/fastmsg/go@v1.0.1或者go get github.com/and3rson/fastmsg/go@latest,此时会正确拉取v1.0.1版本的子模块。pkg.go.dev会在一段时间后同步更新显示正确的版本号。前置检查(如果还没做)
如果go子目录还没有自己的go.mod,先初始化子模块:cd go go mod init github.com/and3rson/fastmsg/go git add go.mod git commit -m "Initialize go submodule"只有子目录存在独立的
go.mod,Go才会将其视为独立模块,接受带路径前缀的版本标签。
补充说明
go get github.com/and3rson/fastmsg能获取v1.0.1是因为这个命令针对的是根目录模块(哪怕它没有Go代码),根目录的标签直接匹配版本号,但实际代码在子目录,所以无法直接使用。
内容的提问来源于stack exchange,提问作者Andrew Dunai

