具有多个模块的单存储库中的 Go 模块名称是否有约定?

Ala*_*ham 5 go go-modules

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

geo*_*eok 9

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

\n

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

\n
\n

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

\n

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

\n
\n

假设我们有以下结构:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkg1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pkg2\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 utils.go\n
Run Code Online (Sandbox Code Playgroud)\n

pkg1/main.go

\n
package main\n\nimport (\n    "fmt"\n    "local/pkg2"\n)\n\nfunc main() {\n    fmt.Println(pkg2.Add(1, 2))\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

pkg1/go.mod

\n
module local/pkg1\n\ngo 1.12\n\nrequire local/pkg2 v0.0.0\n\nreplace local/pkg2 => ../pkg2\n
Run Code Online (Sandbox Code Playgroud)\n

pkg2/utils.go

\n
package pkg2\n\nfunc Add(a, b int) int {\n    return a + b\n}\n
Run Code Online (Sandbox Code Playgroud)\n

pkg2/go.mod

\n
module local/pkg2\n\ngo 1.12\n
Run Code Online (Sandbox Code Playgroud)\n

跑步:

\n
cd pkg1\ngo run main.go\n
Run Code Online (Sandbox Code Playgroud)\n

你得到:

\n
\n

3

\n
\n