开启GO111MODULE模式后导入Go子包提示cannot find package
问题排查与解决方案
核心原因
当前go.mod中锁定的github.com/zhksoftGo/Packet v0.0.0-20210320131229-5311a044e61f版本,对应仓库早期提交,该提交中还未加入protocol/Cactus目录的代码,Go拉取的依赖源码里不存在这个路径,因此报找不到包的错误。你能正常引入根包Packet,是因为这个老版本提交里确实包含根目录的Packet.go,二者不冲突。
分步操作
1. 验证当前拉取的依赖内容
- 在业务项目根目录执行
go mod verify,确认当前使用的Packet包源码位置 - 进入Go模块缓存默认路径
$GOPATH/pkg/mod/github.com/!zhksoft!go/,找到对应版本号的Packet目录,检查是否存在protocol/Cactus子目录,即可确认上述判断。
2. 更新依赖到包含Cactus代码的版本
- 直接执行命令拉取仓库默认分支的最新代码:
go get github.com/zhksoftGo/Packet@main(如果仓库默认分支是master就替换成master),执行后go.mod会自动更新Packet的版本号为最新的提交伪版本,此时就能正常引入子包了。 - 如果不需要拉取全量最新代码,只想指定某一个已经上传了Cactus目录的提交版本,执行
go get github.com/zhksoftGo/Packet@<对应提交的哈希值>即可。
3. 常见坑点检查
- 确认本地的
protocol/Cactus目录及TypeDefineCactus.go文件已经完全推送到远程公开仓库,本地未推送的代码不会被拉取到依赖中 - 检查
TypeDefineCactus.go文件头部的包声明是否为package Cactus,包名和导入路径最后一段不匹配也会触发找不到包的报错 - 操作完成后执行
go mod tidy清理残留的旧版本依赖引用
注:该问题属于Go Modules下版本与提交内容不匹配的典型问题,和你已经开启的GO111MODULE=on配置无关,不需要调整环境变量。
内容的提问来源于stack exchange,提问作者zhk_tiger
相关产品推荐
相关产品推荐

