使用;“去拿”;下载二进制文件而不将其添加到go.mod

使用;“去拿”;下载二进制文件而不将其添加到go.mod,go,go-modules,Go,Go Modules,我在我的项目中使用Go模块,在我的构建系统中(例如Travis CI),我正在下载一个带有Go-get的命令行实用程序(以Go编写),以协助我的构建过程,例如: go get github.com/mitchellh/gox 但是,此go-get会将文件添加到我的go.mod文件中。这污染了构建环境,导致它“脏”(因为在git中跟踪的一些文件发生了更改,在本例中是go.mod和go.sum),我使用git descripe--always--dirty--tag来描述我的构建,它显示为“脏”

我在我的项目中使用Go模块,在我的构建系统中(例如Travis CI),我正在下载一个带有
Go-get
的命令行实用程序(以Go编写),以协助我的构建过程,例如:

go get github.com/mitchellh/gox
但是,此
go-get
会将文件添加到我的
go.mod
文件中。这污染了构建环境,导致它“脏”(因为在git中跟踪的一些文件发生了更改,在本例中是go.mod和go.sum),我使用
git descripe--always--dirty--tag
来描述我的构建,它显示为“脏”

有没有一种方法可以“获取”一个二进制文件,只需下载它,而不将它添加到go.mod/go.sum中

我已经尝试将GOPATH设置为其他位置,即使在那时,
go-get
更新go.mod/go.sum,将其添加为一个
//间接的
依赖项

dir=“$(mktemp-d)”\
env GOPATH=“$dir”转到github.com/mitchellh/gox&&\
mv“$dir/bin/gox”“$(go环境路径)”/bin/gox

按照
进行帮助构建

-mod build标志提供了对go.mod的更新和使用的额外控制

如果使用-mod=readonly调用,则go命令不允许隐式自动更新go.mod


希望在Go 1.14中会有一个新的
Go get
标志,它完全符合您的要求。问题“cmd/go:提供一致的全局安装命令”对此进行了跟踪

在此之前,您有几个不同的选择

转到1.12和1.13:更改目录 如果您使用的是Go 1.12或更高版本,最简单的解决方案可能是在执行Go get之前,将当前模块外的目录移动到没有Go.mod的目录,例如:

$ cd /tmp                              
$ go get github.com/foo/bar@v1.2.3
$ cd -                                # return to prior directory
前进1.11、1.12、1.13+:戈宾 是一个模块感知命令,用于安装或运行二进制文件,提供了额外的灵活性,包括在不更改当前模块的
go.mod
的情况下进行安装的能力。有关更多详细信息,请参阅
gobin

Go 1.11:临时模块 如果您在模块中使用Go 1.11,第一步可能是升级到Go 1.12或1.13,因为模块中有许多改进。如果您需要使用Go 1.11,并且希望使用
@version
语法而不更新当前模块的
Go.mod
,则一种方法是创建临时模块:

cd $(mktemp -d) && go mod init tempmod && go get github.com/foo/bar@v1.2.3
这是因为在Go 1.11中,除非您在模块中,否则不能使用
@version
语法,而在Go 1.12中,该语法是宽松的。这一方法已由一家公司自动化

其他细节 通常,模块模块中的
go
命令总是确定它“在”哪个模块中,这是基于调用
go
命令时的当前工作目录。(您可以类比没有任何参数的
make
如何在当前工作目录中查找makefile,或者没有任何参数的
go build
如何构建当前工作目录,等等)

对于模块,
go-get
在当前工作目录或其任何父目录中查找
go.mod
文件,并且
go-get
将使用任何
go.mod
中列出的约束作为版本求解的一部分,并在执行
go-get
的基础上根据需要更新
go.mod
。这就是为什么如果从现有模块中运行
go-get
,则会更新
go.mod
文件的原因

另一方面,从Go 1.12开始,如果您所在的目录不是任何模块的一部分(即,该目录没有
Go.mod
,也没有任何父目录),则没有
Go.mod
可更新,但是
go
命令仍然能够在模块模式下运行,并使用
@version
语法

从:

当GO111MODULE设置为on时,go命令现在支持模块目录外的模块感知操作,前提是这些操作不需要解析相对于当前目录的导入路径或显式编辑go.mod文件。go-get、go-list和go-mod-download等命令的行为就像在一个最初需求为空的模块中一样。在此模式下,go env GOMOD报告系统的空设备(/dev/null或NUL)

从1.16开始 Go 1.16(2021年2月发布)包括一项更改,使安装二进制文件不影响Go.mod

问题跟踪建议:

cmd/go:'go install'应在模块外以模块模式安装可执行文件

这是在CL中实现的。作为此更改的一部分,如果我理解正确,您可以运行:

go install github.com/foo/bar@latest 

要安装命令而不影响go.mod

安装工具时是否尝试过禁用模块?例如,
GO111MODULE=off-GO111MODULE=off-go-get-v golang.org/x/text
这可能会起作用,但我假设这不是一个长期解决方案。当go模块被广泛使用时,GO111MODULE在更新的go版本中是否会被忽略?我认为,在每个人都适应模块之前,GO111MODULE还很遥远。另一个解决方案是在安装工具之前更改目录
go.mod
将不在当前目录中,模块将被禁用。请澄清,如果您将目录更改为没有go.mod的位置,则模块将被禁用是不正确的。更多详情见下文。遗憾的是,go-get-mod=readonly github.com/mitchellh/gox仍在更新。然而,这可能是一个合法的golang问题。2.您引用的句子的其余部分类似于
…相反,当需要对go.mod进行任何更改时,它会失败。
go get-mod=readonly
将在1.13@georgeok中修复该问题,该问题与此无关。建议的编辑队列已满,因此我将添加注释。跟踪在CL中实施的提案。这很可能包含在G中