在repo中使用多个模块时,Go-get找不到本地包

在repo中使用多个模块时,Go-get找不到本地包,go,module,go-modules,Go,Module,Go Modules,我对go的新模块系统有问题,因为我想定义一个本地模块并将其导入主程序。本地包位于主包/根文件夹的文件夹中。想象一下$GOPATH之外的以下项目结构 项目结构 /main.go /型号/人 在根文件夹中,我通过调用 go mod init example.com/localModule go mod init example.com/localModule/model 在model/文件夹中,我通过调用 go mod init example.com/localModule go mod

我对go的新模块系统有问题,因为我想定义一个本地模块并将其导入主程序。本地包位于主包/根文件夹的文件夹中。想象一下
$GOPATH
之外的以下项目结构

项目结构 /main.go

/型号/人

在根文件夹中,我通过调用

go mod init example.com/localModule
go mod init example.com/localModule/model
model/
文件夹中,我通过调用

go mod init example.com/localModule
go mod init example.com/localModule/model
错误 在根文件夹中调用以下命令失败

$ 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的错误消息被切断,我没有错误地解析它

我不打算将模块推送到服务器上,只需要一种引用本地包
model
,所以我分别选择了
example.com/localModule/
example.com/localModule/model

我在运行MacOS 10.13.6的Macbook上使用的是
go1.11 darwin/amd64

通过在go.mod中添加一个require语句和一个匹配的replace语句以及一个相对文件路径,您可以拥有您所要求的本地“子”模块

在“根目录”中/go.mod:

根本问题 出现此错误的原因是您定义了两个模块,它们不知道如何在本地磁盘上找到彼此

$ go build
main.go:4:8: unknown import path "example.com/localModule/model": 
 cannot find module providing package example.com/localModule/model
解决方案1:
替换
您可以向顶部模块的
go.mod
文件添加
replace
指令,例如:

替换example.com/localModule/model v0.0.0=>。/model

这使顶部模块可以在磁盘上找到另一个模块。模块wiki上的和部分详细介绍了这一点

但是,这是一个更复杂的解决方案,可能很难正确执行,通常是更持续的工作,并且有一些限制,例如对除当前模块之外的所有模块忽略
replace
。对大多数人来说,多模块回购可能不是他们想要的。在这一点上,真正需要在单个存储库中包含多个模块的情况相对较少

解决方案2:一个回购=一个模块 虽然可以使用
replace
指令,但更常见和简单的解决方案是:

  • 在您的存储库中有一个
    go.mod
    文件,并且
  • 将单个
    go.mod
    文件放在存储库的根目录中
这是一个非常简单的解决方案,这意味着存储库中的两个软件包将能够自动找到对方,而无需任何
替换
,从而避免您报告的错误消息

替换为多模块回购,而不是单模块回购? 罗斯·考克斯评论道:

对于除超级用户以外的所有用户,您可能希望采用通常的约定,即一个回购=一个模块。回购协议可以包含多个模块,这对于代码存储选项的长期发展很重要,但在默认情况下,这几乎肯定不是您想要做的事情

如果您希望在一个存储库中定义多个模块,那么在如何正确定义模块方面存在相当多的细微差别,并且应该阅读模块wiki中关于如何管理与单个存储库中多个模块相关联的复杂性的部分,包括以下建议:

在单个存储库中添加模块、删除模块以及使用多个模块对模块进行版本控制都需要相当的谨慎和慎重,因此管理单个模块存储库几乎总是比管理现有存储库中的多个模块更容易、更简单


这是一种可能的解决方案,但与每个存储库一个模块的更常见方法相比,这是一种更为复杂的解决方案,从而避免了此错误和问题。请注意,肯定有一些解决方案采用了多模块回购方法,因此,任何考虑采用本答案中所述的
替换
+多模块回购方法的人,在走上这条道路之前,都应该仔细评估其他选项。这里面有更多的细节。它似乎不能正常工作
$ go build
main.go:4:8: unknown import path "example.com/localModule/model": 
 cannot find module providing package example.com/localModule/model