修复 go 使用的工具版本

fixing versions of tools used by go

我希望使用 go 创建可重现的构建。 对于个别项目,我们正在使用 glide。

例如我使用:

glide get github.com/stretchr/testify

修复"testify"包的版本。 但是,这不适用于工具。 例如:

glide install github.com/tebeka/go2xunit

returns成功但没有真正安装go2xunit 所以我必须使用:

go get github.com/tebeka/go2xunit

go2xunit 安装到 $GOPATH/bin

Q如何修改go2xunit等工具的版本?

我也注意到glide says use dep instead and dep says golang has diverged from its implementation and will probably end up using something based on vgo。 go 有很多依赖管理工具,也许不太知名的工具之一支持这个?

如果相关,我使用 Debian9 提供的 go 1.7.4。

go1.11使用go modules的解决方法是创建一个fake tools package。 您创建一个 tools.go 文件,如下所示:

// +build tools

package tools

import (
        _ "github.com/tebeka/go2xunit"
)

+build tools 是一个神奇的注释,它会阻止构建包。

>go mod init tools

将为假 tools package

创建一个 go.mod 文件
>go install github.com/tebeka/go2xunit

将安装 go2xunit 并更新 go.mod 如下。

module tools

require github.com/tebeka/go2xunit v1.4.8 // indirect

现在如果你 运行 去安装 github.com/tebeka/go2xunit 以后(对于一个干净的构建来说)它的版本将是go.mod

固定为 v1.4

对于 1.11 之前的 go 版本,使用的工具是 retool。 它是这样工作的:

bootstrap:

go get github.com/twitchtv/retool

添加工具:

retool add github.com/jteeuwen/go-bindata/go-bindata origin/master

使用工具:

retool do go-bindata -pkg testdata -o ./testdata/testdata.go ./testdata/data.json

添加对此的支持可能在目标 go 1.12 的路线图上 (https://github.com/golang/go/issues/27653)

我做的非常相似,但差异很大,我认为值得再次分享:

如果出现错误

我没有看到我想要添加到 go.mod 的依赖项,我收到了这个错误:

tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package

(fileb0x 是我要添加的内容)

我不是 100% 清楚修复它的事件顺序,但我做了所有这些事情:

使用 "tools" 包

我做了一个tools目录:

mkdir -p tools

我把工具包放在里面(如上所述):

// +build tools

package tools

import (
    _ "github.com/UnnoTed/fileb0x"
)

请注意,标签大部分不重要。你可以使用 foo:

// +build foo

但是,您不能使用 ignore。那是一个特殊的预定义标签。

// +build ignore

// NO NO NO NO NO
// `ignore` is a special keyword which (surprise) will cause
// the file to be ignore, even for dependencies

正在更新go.mod

最好的方法可能是 运行 go mod tidy:

go mod tidy

然而,在我这样做之前,我 运行 了一些命令试图找出哪个命令会导致它进入 go.mod:

go install github.com/UnnoTed/fileb0x # didn't seem to do the trick
go get
go generate ./...
go build ./...
go install ./...
go mod vendor

后来我做了 git resetrm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod,发现 go mod tidy 本身就做得很好。

销售

为了真正利用项目中的模块缓存,您需要复制源代码

go mod vendor

这将从 go.mod

获取所有依赖项

您还需要更改几乎所有 go 命令以在任何 MakefileDockerfile 或其他脚本中使用 -mod=vendor

go fmt -mod=vendor ./... # has a bug which should be fixed in go1.15
go generate -mod=vendor ./...
go build -mod=vendor ./...

包括 go buildgo getgo installgo generate 调用的任何 go run(甚至 go generate 本身)

//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package main

// ...