Go模块go.mod在子文件夹时,如何正确导入其子包?
问题原因
你的Go模块的go.mod文件放在apps目录而非仓库根目录,导致模块的实际路径是github.com/zhaoyi0113/test-go-module/apps,而非你以为的根路径github.com/zhaoyi0113/test-go-module。之前执行go get github.com/zhaoyi0113/test-go-module@0.0.2成功,是因为Go会自动将无go.mod的仓库根目录视为一个空模块,但这个根模块并不包含apps/logger子包——该子包属于apps目录下的模块。
解决方案
方案一:调整模块到仓库根目录(推荐)
这是Go模块的标准结构,能避免路径混淆:
- 将
apps目录下的go.mod文件移动到仓库根目录 - 修改根目录
go.mod中的module声明为:module github.com/zhaoyi0113/test-go-module - 重新给仓库打版本tag(比如
v0.0.3),并推送到GitHub - 在使用该模块的项目中执行:
go get github.com/zhaoyi0113/test-go-module@v0.0.3 - 保持原导入路径
github.com/zhaoyi0113/test-go-module/apps/logger即可正常编译
方案二:保留现有结构,正确引用子模块
如果不想调整目录结构,需要按实际模块路径操作:
- 给
apps目录下的模块打版本tag(遵循Go子模块tag规则,格式为apps/v0.0.2),推送到GitHub - 在使用项目中执行:
go get github.com/zhaoyi0113/test-go-module/apps@v0.0.2 - 原导入路径
github.com/zhaoyi0113/test-go-module/apps/logger即可正常使用,因为此时Go能识别该包属于github.com/zhaoyi0113/test-go-module/apps模块下的子包
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

