修复 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 reset
和 rm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod
,发现 go mod tidy
本身就做得很好。
销售
为了真正利用项目中的模块缓存,您需要复制源代码
go mod vendor
这将从 go.mod
获取所有依赖项
您还需要更改几乎所有 go 命令以在任何 Makefile
、Dockerfile
或其他脚本中使用 -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 build
、go get
、go install
和 go generate
调用的任何 go run
(甚至 go generate
本身)
//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package main
// ...
我希望使用 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 reset
和 rm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod
,发现 go mod tidy
本身就做得很好。
销售
为了真正利用项目中的模块缓存,您需要复制源代码
go mod vendor
这将从 go.mod
获取所有依赖项您还需要更改几乎所有 go 命令以在任何 Makefile
、Dockerfile
或其他脚本中使用 -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 build
、go get
、go install
和 go generate
调用的任何 go run
(甚至 go generate
本身)
//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package main
// ...