为了账号安全,请及时绑定邮箱和手机立即绑定

修复 go 使用的工具版本

修复 go 使用的工具版本

Go
智慧大石 2023-05-04 17:17:40
我希望使用 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的东西。有大量的依赖管理工具,也许不太知名的工具之一支持这个?如果相关,我正在使用 Debian9 提供的 go 1.7.4。
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

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


如果你得到一个错误

我没有看到我想要添加到 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 resetand rm -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


// ...


查看完整回答
反对 回复 2023-05-04
?
aluckdog

TA贡献1847条经验 获得超7个赞

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)


查看完整回答
反对 回复 2023-05-04
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信