Go模块依赖查询异常:导入根模块无法列依赖及报错分析
核心原因
这个错误的本质是:你尝试导入的github.com/dinedal/textql模块根目录下不存在对应包的Go代码。
Go模块的命名规则是,模块名(也就是go.mod里声明的module github.com/dinedal/textql)对应的是模块根目录的包路径。当你执行go list -deps github.com/dinedal/textql或者在代码里导入这个根路径时,Go会去查找该模块根目录下属于github.com/dinedal/textql包的.go文件,但从错误信息和你之前的使用情况来看,这个模块的根目录没有这类文件——只有子目录storage下有属于github.com/dinedal/textql/storage包的代码,所以你导入子包时一切正常,导入根路径就会报错。
从你拿到的模块版本v0.0.0-20200608170856-250cf763f52c也能推测,这个模块可能是一个仅包含子包的项目,作者没有在根目录编写任何属于根包的代码。
解决办法
根据你的实际需求,分两种情况处理:
仅需要使用
storage子包
保持当前的导入方式import "github.com/dinedal/textql/storage"即可,这是完全合规的用法,依赖列表也能正常生成。确实需要导入根包
github.com/dinedal/textql- 如果这个模块是你自己维护的:在模块根目录添加至少一个
.go文件,并且在文件开头声明package textql(包名要和模块路径的最后一段一致),之后重新发布模块版本,本地执行go get -u github.com/dinedal/textql更新依赖即可。 - 如果这是第三方模块:要么接受它没有根包的现状,只使用子包;要么联系项目作者,建议在根目录添加根包代码;或者fork这个项目,自己在根目录添加所需的根包代码,然后使用你fork后的模块地址。
- 如果这个模块是你自己维护的:在模块根目录添加至少一个
另外补充一点:执行go list -deps时,如果是针对本地项目,确保你在项目根目录执行;如果是针对远程模块,Go会拉取模块的元数据和代码进行检查,而这里的问题核心就是远程模块根目录没有对应包的代码。
内容的提问来源于stack exchange,提问作者Zombo

