在具有多个模块的mono repos中,Go模块名称是否有约定?

在具有多个模块的mono repos中,Go模块名称是否有约定?,go,go-modules,Go,Go Modules,在多模块存储库中,模块名称(通过go.modmodule指令设置)是否应遵循包命名的约定 例如,module github.com/org name/repo name/path/to/module dir 我理解,无论模块名如何,模块内的包都使用模块名作为前缀相互引用。但是,从模块外部看,如果模块名称设置为非模式,则似乎会出现问题获取-加载模块中包含的包后,会显示有关无法识别的导入路径的消息 是否有任何理由将模块命名为与不同的名称?引用模块没有任何硬性要求,尽管使用域/repo模式始终是一种良

在多模块存储库中,模块名称(通过go.mod
module
指令设置)是否应遵循包命名的约定

例如,
module github.com/org name/repo name/path/to/module dir

我理解,无论模块名如何,模块内的包都使用模块名作为前缀相互引用。但是,从模块外部看,如果模块名称设置为非
模式,则似乎会出现问题<代码>获取-加载模块中包含的包后,会显示有关
无法识别的导入路径的消息


是否有任何理由将模块命名为与
不同的名称?

引用模块没有任何硬性要求,尽管使用域/repo模式始终是一种良好的做法。因此,如果要在本地引用不在GOPATH中的其他模块,可以使用
replace
指令

replace还可用于通知go工具多模块项目中模块的相对或绝对磁盘位置,例如:

替换example.com/project/foo=>../foo

假设我们有以下结构:

├── .gitignore
├── pkg1
│   ├── go.mod
│   └── main.go
└── pkg2
    ├── go.mod
    └── utils.go
pkg1/main.go

package main

import (
    "fmt"
    "local/pkg2"
)

func main() {
    fmt.Println(pkg2.Add(1, 2))

}
pkg1/go.mod

module local/pkg1

go 1.12

require local/pkg2 v0.0.0

replace local/pkg2 => ../pkg2
pkg2/utils.go

package pkg2

func Add(a, b int) int {
    return a + b
}
pkg2/go.mod

module local/pkg2

go 1.12
运行:

cd pkg1
go run main.go
你会得到:

三,


如果您希望能够
获取
模块,它应该遵循
/repo/path/in/repo
模式

然而,我建议退一步,问问你是否真的想要多模块回购。它增加了实质性的复杂性,很难做到正确,通常意味着要持续进行更多的工作

罗斯·考克斯评论道:

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

有关更多详细信息,请参阅