6

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

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

我知道,无论模块命名如何,模块中的包都使用模块名称作为前缀相互引用。但是,从模块外部来看,如果模块名称设置为模式以外的名称,似乎会出现问题<host><path-within-repo>get-ing 一个包含在模块中的包,然后给出关于unrecognized import path.

是否有任何理由以不同的方式命名模块<host><path-within-repo>

4

2 回答 2

6

引用模块没有任何硬性要求,尽管使用 domain/repo 模式总是很好的做法。所以,如果你想在本地引用其他不在 GOPATH 中的模块,你可以使用该replace指令。

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

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

替换 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

你得到:

3

于 2019-07-05T12:57:19.870 回答
0

如果你想要go get一个模块,它应该遵循<host>/repo/path/within/repo模式。

但是,我建议您退后一步,询问您是否真的想要一个多模块 repo。它增加了相当大的复杂性,很难做到正确,并且通常意味着更多的工作需要持续进行。

Russ Cox 在#26664中评论:

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

有关详细信息,请参阅“使用 Go 模块组织包中的本地代码”

于 2019-08-02T18:50:15.813 回答