英文:
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 文件,构建仍然成功,并且不会生成或更新 go.mod。
我的问题是:在后一种情况下,使用的是哪个 go.mod?go 是否使用来自 github.com/some/go/tool
的那个?这个是否有文档记录?
英文:
If I run a command similar to the following:
go build -mod=mod -o xyz.exe github.com/some/go/tool
And I'm in a directory with a go.mod, I noticed that the go.mod will be updated with a reference to github.com/some/go/tool
, and xyz.exe will be built. So the go.mod being used is the one in the current directory.
However, if I change to some empty tmp folder with no go.mod, the build still succeeds and no go.mod is generated or updated.
My question is: in the latter case, what go.mod is used? Does go use the one from github.com/some/go/tool? And, is this documented somewhere?
答案1
得分: 3
当你在一个已存在 go.mod 文件的目录中运行命令 go build -mod=mod -o xyz.exe github.com/some/go/tool 时,Go 会使用当前目录中的 go.mod 文件,并将构建 github.com/some/go/tool 包时添加的任何新依赖项添加到该 go.mod 文件中。
然而,当你在一个没有 go.mod 文件的目录中运行该命令时,Go 仍然能够构建该包,但不会在当前目录中创建或更新 go.mod 文件。
当 Go 构建一个不在当前模块中的包(当前目录的 go.mod 所定义的模块),如果存在,它将使用正在构建的包的 go.mod 文件。在这种情况下,github.com/some/go/tool 应该有自己的 go.mod 文件,并且在构建和解析依赖项时将使用该文件。
Go 的这种行为在 go help build 文档的 "Modules" 部分中有详细说明。
https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more
英文:
When you run the command go build -mod=mod -o xyz.exe github.com/some/go/tool in a directory with an existing go.mod file, Go will use the go.mod in the current directory, and any new dependencies added as a result of building the github.com/some/go/tool package will be added to that go.mod file.
However, when you run the command in a directory without a go.mod file, Go will still be able to build the package, but it will not create or update a go.mod file in the current directory.
When Go is building a package that is not in the current module (the module defined by the current directory's go.mod), it will use the go.mod file of the package that you are building if present. In this case github.com/some/go/tool should have it's own go.mod file and it will be used when building and resolving the dependencies.
This behavior of Go is specified in the go help build documentation, under the section "Modules" specifically.
https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more
答案2
得分: 1
让我们来看看go.mod的作用:
以Windows操作系统为例:
go mod文件如下:
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\pkg\
和go Root
。
因此,即使没有go.mod文件,它仍然可以构建和运行。
如果在本地删除\go\pkg\...\mapstructure
,则无法运行或构建。
go mod可以在不同的环境(不同的计算机/操作系统)中进行一致的构建,并处理不同版本和包依赖关系。
英文:
let's take a look at what go.mod does:
Take windows-os as an example:
go mod file like:
module xxx
go 1.19
require github.com/mitchellh/mapstructure v1.5.0
if you run
go build -mod=mod xxx
it will be download mapstructure
in
C:\Users\{username}\go\pkg\mod\github.com\mitchellh\mapstructure@v1.5.0
Next, if you delete the go.mod, \go\pkg\...\mapstructure
still exists.
go will look up \go\pkg\
and go Root
, when go run/build.
so it can build/run even there is no go.mod
if delete \go\pkg\...\mapstructure
in local, it will can't run/build
go mod can build consistently in different environments(different pc/os).and deal different version and package dependencies
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论