在多模块存储库中,模块名称(通过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>
?
答案 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"。