【问题标题】:`go install` adds record in `go.mod``go install` 在 `go.mod` 中添加记录
【发布时间】:2020-01-23 19:02:01
【问题描述】:

我对 Go 模块如何使用 go install 安装二进制文件感到有些困惑。

我尝试通过执行go install github.com/joho/godotenv/cmd/godotenv 来安装(https://github.com/joho/godotenv)二进制文件,我发现它在go.mod 中添加了一条记录。 我迷路了,因为我们没有在代码中使用这个包,并且在运行go mod tidy 之后它被删除(因为它不是代码)。

有人可以解释一下 go 模块的预期行为吗? 其次,我如何避免将它添加到go.mod,因为我们只需要安装和执行二进制文件?

谢谢。

Go 版本:go version go1.13.4 darwin/amd64

【问题讨论】:

  • "有人能解释一下 Go 模块的预期行为吗?"粗略地说:go 工具在模块“内部”的大多数调用都会检查、更新 go.{mod,sum},这对于buildtestget 和大部分mod 来说是显而易见的。现在想想go install <modulename>/path/to/modulepackage 做了什么:它从当前模块构建一个包并安装它;正在更新 go.*。您从不相关的包中安装了一些命令的事实在这里是次要的。只是来自 /tmp 的 go install 东西,而不是来自模块“内部”的东西。

标签: go go-modules


【解决方案1】:

Command go: The go.mod file:

go 命令每次使用模块图时都会自动更新 go.mod,以确保 go.mod 始终准确反映现实并正确格式化。

go 工具在执行构建时检测到依赖项不准确时会自动更新go.mod

当您从模块安装 github.com/joho/godotenv/cmd/godotenv 时,此安装至少需要构建/安装有问题的包(以及它的依赖项,可传递)。

您可以安全地运行go mod tidy 来撤消对这种“一次性”依赖项的记录。

一般来说,如果你想禁止 go 工具更新 go.mod 文件,你可以使用 -mod=readonly 标志,但这会失败 go install ("can't load package: package xxx : 导入查找被 -mod=readonly" 禁用)。您可以在此处阅读更多信息:Go Wiki: Go modules: Can I control when go.mod gets updated and when the go tools use the network to satisfy dependencies?

或者,如果您想避免这种情况,请在您的模块之外构建/安装您的工具。您可以为此使用“虚拟”模块。

【讨论】:

  • 你也可以使用env GO111MODULE=off go install <package>
猜你喜欢
  • 1970-01-01
  • 2021-08-26
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多