编辑多个未发布的 Go 模块的本地副本

分享于2022年07月17日 go go-modules 问答
【问题标题】:编辑多个未发布的 Go 模块的本地副本(Editing local copies of multiple unpublished Go Modules)
【发布时间】:2022-03-26 04:45:40
【问题描述】:

是我自己还是使用未发布的 go 模块非常痛苦?

https://go.dev/doc/modules/managing-dependencies#tmp_9

https://groups.google.com/g/golang-nuts/c/9MfGXLmRu8w/m/D2gm_viYBAAJ

从这两个链接中,我找到了替换指令。但现在我遇到了困难。

假设我有包 example.com/p1、example.com/p2 和 example.com/p3。 p1 使用 p2,p2 使用 p3。

我添加了替换指令:

  • go.mod for p2 中 p3 的路径
  • p1 的 go.mod 中 p2 的路径

但现在看来我还需要在 p1 的 go.mod 中为 p3 添加一个替换指令。 由于我拥有大量未发布的软件包,这变得非常痛苦。

这是预期的还是我做错了什么?

  • 你用过 Git 吗?您可以使用私有 Git URL 作为模块路径。
  • 如果这些都未发布,为什么要在多个模块中?将它们组合在一起可能更容易,因为没有发布的位置可以从中获取它们。否则你必须在主包的模块中使用替换
  • @JimB 将它们组合在一起是我采用的方法,现在还可以。谢谢!

【解决方案1】:

正如其他人所说,将所有内容放在一个未发布的模块中比将内容拆分为多个模块要容易得多。这使得留在“幸福的道路”上变得更加容易,而且对于你的情况,这听起来很有效。

也就是说,如果您升级到 Go 1.18,新的 workspace 功能可以更轻松地同时编辑多个本地模块:

借助多模块工作区,您可以告诉 Go 命令您同时在多个模块中编写代码,并轻松地在这些模块中构建和运行代码。

例如,从包含多个模块目录(每个都有自己的 go.mod 文件)的父目录中,您可以创建一个 go.work 文件并递归地添加下面的模块:

$ go work init
$ go work use -r .

例如,如果您有两个模块,假设模块 foo 导入模块 bar ,则生成的 go.work 文件可能如下所示:

$ cat go.work
go 1.18

use (
        ./foo
        ./bar
)

如果您随后 cd 到 foo 目录, go build 之类的命令将使用 foo bar 的本地副本。

机制是 go 命令检查它是否在带有 go.work 文件的目录树内,默认情况下它会查阅找到的任何 go.work 文件以帮助解决依赖项所在的位置。

有关工作空间的更多信息,这里有一个很好的教程: https://go.dev/doc/tutorial/workspaces

或者,您可以使用将 replace directives 添加到您的个人go.mod 文件的旧技术,但这不如新的 go.work 功能好。

最后,即使考虑到新的 go.work 功能,值得重申的是,如果您一次只使用一个模块,您的生活会更简单,所以不要不必要地切割可能是单个模块的东西.