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

时间:2019-07-05 11:39:24

标签: go go-modules

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

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

我知道,无论模块被命名为什么,模块内的软件包都使用模块名称作为前缀相互引用。但是,从模块外部看,如果模块名称设置为<host><path-within-repo>模式以外的名称,则似乎会出现问题。 get-打开模块中包含的软件包,然后给出有关unrecognized import path的消息。

是否有任何原因使模块的名称不同于<host><path-within-repo>

2 个答案:

答案 0 :(得分:1)

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

https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive

  

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

     

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

假设我们具有以下结构:

├── .gitingore
├── 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

您得到:

  

3

答案 1 :(得分:0)

如果您希望能够go get一个模块,则它应该遵循<host>/repo/path/within/repo模式。

但是,我建议退后一步,询问您是否确实想要多模块回购。它增加了相当大的复杂性,很难解决,并且通常意味着需要不断进行更多的工作。

Russ Cox在#26664中发表了评论:

  

对于除高级用户以外的所有用户,您可能希望采用一种惯例,即一个仓库=一个模块。存储库可以包含多个模块对于代码存储选项的长期发展很重要,但是默认情况下,您肯定不需要这样做。

有关更多详细信息,请参见"Organize local code in packages using Go modules"