Go get cannot find local packages when using modules
我对Go的新模块系统有问题,因为我想定义一个本地模块并将其导入主程序。本地包位于主包/根文件夹的文件夹中。想象一下在
去。
1 2 3 4 5 6 7 8 9 10 | package main import"fmt" import"example.com/localModule/model" func main() { var p = model.Person{name:"Dieter", age:25} fmt.Printf("Hello %s ", p.name) } |
/型号/人.go
1 2 3 4 5 6 | package model type Person struct { name string age int } |
在根文件夹中,我通过调用
1 | go mod init example.com/localModule |
在
1 | go mod init example.com/localModule/model |
误差
在根文件夹中调用以下命令失败。
1 2 3 4 5 | $ go get go build example.com/localModule/model: no Go files in $ go build main.go:4:8: unknown import path"example.com/localModule/model": cannot find module providing package example.com/localModule/model |
Go-Get的错误消息被切断了,我不能错误地解析它。
我不打算把模块推到服务器上,只需要一种引用本地包
我在运行MacOS 10.13.6的MacBook上使用
通过在go.mod中添加一个require语句和一个匹配的replace语句以及一个相对文件路径,可以像您要求的那样拥有本地"sub"模块。
在"root."/go.mod中:
1 2 3 4 5 | module example.com/localModule require example.com/localModule/model v0.0.0 replace example.com/localModule/model v0.0.0 => ./model |
出现此错误的原因是您定义了两个不知道如何在本地磁盘上找到彼此的模块。
1 2 3 | $ go build main.go:4:8: unknown import path"example.com/localModule/model": cannot find module providing package example.com/localModule/model |
虽然可以使用
- 在您的存储库中有一个单独的
go.mod 文件,并且 - 将单个
go.mod 文件放在存储库的根目录中。
这是一个非常简单的解决方案,这意味着存储库中的两个包将能够找到彼此,从而避免了您报告的错误消息,也避免了在这里需要一个
Russ Cox在26664年评论道:
For all but power users, you probably want to adopt the usual convention that one repo = one module. It's important for long-term evolution of code storage options that a repo can contain multiple modules, but it's almost certainly not something you want to do by default.
如果您希望在单个存储库中定义多个模块,那么关于如何正确地定义多个模块有相当多的细微差别,并且在模块wiki中有一个完整的部分,介绍如何管理与单个存储库中多个模块相关联的复杂性,包括以下建议:
Adding modules, removing modules, and versioning modules with multiple modules in a single repository requires considerable care and deliberation, so it is almost always easier and simpler to manage a single-module repository rather than multiple modules in an existing repository.
和
Please read all of the FAQs in this sub-section carefully if you are considering having multiple modules in a single repository.