0

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

例如,我使用:

glide get github.com/stretchr/testify

修复“作证”包的版本。但是,这不适用于工具。例如:

glide install github.com/tebeka/go2xunit

返回成功但实际上并没有安装 go2xunit 所以我必须使用:

go get github.com/tebeka/go2xunit

它将go2xunit安装到$GOPATH/bin

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

我还注意到glide 说使用 dep 而dep 说golang 已经偏离了它的实现,可能最终会使用基于vgo的东西。Go 有大量的依赖管理工具,也许其中一个不太知名的工具支持这一点?

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

4

2 回答 2

0

go1.11 使用 go modules 的解决方案是创建一个假的工具包。您创建一个tools.go文件,如下所示:

// +build tools

package tools

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

+build tools 是一个神奇的注释,可以防止构建包。

>go mod init tools

将为伪造的工具包创建一个go.mod文件

>go install github.com/tebeka/go2xunit

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

module tools

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

现在,如果您将来运行go install github.com/tebeka/go2xunit(对于干净的构建来说),它的版本将由 go.mod 固定为 v1.4


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

引导程序:

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 )的路线图上

于 2018-10-31T17:45:57.170 回答
0

我这样做非常相似,但只是不同,我认为值得再次分享:

如果你得到一个错误

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

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

(fileb0x 是我要添加的东西)

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

使用“工具”包

我做了一个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 命令以-mod=vendor在任何Makefiles、Dockerfiles 或其他脚本中使用。

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 run被调用的go generate(甚至是go generate它自己)

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

// ...
于 2020-02-24T20:29:14.413 回答