繁体   English   中英

go build -mod=mod 没有 go.mod

[英]go build -mod=mod with no go.mod

如果我运行类似于以下的命令:

go build -mod=mod -o xyz.exe github.com/some/go/tool

我在一个包含 go.mod 的目录中,我注意到 go.mod 将参考github.com/some/go/tool进行更新,并且将构建 xyz.exe。 所以正在使用的 go.mod 是当前目录中的那个。

但是,如果我更改为某个没有 go.mod 的空 tmp 文件夹,构建仍然会成功,并且不会生成或更新 go.mod。

我的问题是:在后一种情况下,使用了什么 go.mod? go 是否使用 github.com/some/go/tool 中的那个? 而且,这是否记录在某处?

当您在具有现有 go.mod 文件的目录中运行命令 go build -mod=mod -o xyz.exe github.com/some/go/tool 时,Go 将使用当前目录中的 go.mod,以及任何由于构建 github.com/some/go/tool package 而添加的新依赖项将添加到该 go.mod 文件中。

但是,当您在没有 go.mod 文件的目录中运行该命令时,Go 仍将能够构建 package,但它不会在当前目录中创建或更新 go.mod 文件。

当 Go 正在构建不在当前模块(当前目录的 go.mod 定义的模块)中的 package 时,它将使用您正在构建的 package 的 go.mod 文件(如果存在)。 在这种情况下,github.com/some/go/tool 应该有它自己的 go.mod 文件,它将在构建和解析依赖项时使用。

Go 的这种行为在 go 帮助构建文档中指定,具体位于“模块”部分下。

https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

让我们看看 go.mod 做了什么:

以windows-os为例:

go 模组文件如:

module xxx

go 1.19

require github.com/mitchellh/mapstructure v1.5.0

如果你跑

go build -mod=mod  xxx

它将在mapstructure C:\Users\{username}\go\pkg\mod\github.com\mitchellh\mapstructure@v1.5.0

接下来,如果删除 go.mod, \go\pkg\...\mapstructure仍然存在。

go 将在 go 运行/构建时查找\go\pkg\go Root

所以它可以构建/运行即使没有 go.mod

如果在本地删除\go\pkg\...\mapstructure ,它将无法运行/构建

go mod 可以在不同的环境(不同的 pc/os)中一致地构建。并处理不同的版本和 package 依赖

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM