go模块如何与可安装命令一起使用?

and*_*dig 5 go

我最近开始使用Go 1.11,并且喜欢这些模块。除了运行时依赖之外,我还需要在构建期间(例如在期间)使用go模块go generate

如何安装特定的构建依赖项(例如github.com/aprice/embed/cmd/embed)并从哪个文件夹运行该特定工具?是go get正确的工具吗?

Coo*_*J86 6

如果出现错误

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

internal/tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package
Run Code Online (Sandbox Code Playgroud)

(fileb0x 是我要添加的东西)

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

使用“工具”包

我做了一个tools目录:

internal/tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package
Run Code Online (Sandbox Code Playgroud)

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

internal/tools/tools.go

mkdir -p internal/tools
Run Code Online (Sandbox Code Playgroud)

请注意,标签通常并不重要。你可以使用 foo:

// +build foo
Run Code Online (Sandbox Code Playgroud)

但是,您不能使用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
Run Code Online (Sandbox Code Playgroud)

更新 go.mod

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

go mod tidy
Run Code Online (Sandbox Code Playgroud)

但是,在我这样做之前,我运行了许多命令,试图找出哪个命令会导致它进入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
Run Code Online (Sandbox Code Playgroud)

后来我做了一个git reset并且rm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod发现go mod tidy它本身就足够好。

售卖

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

go mod vendor
Run Code Online (Sandbox Code Playgroud)

这将从 go.mod 获取所有依赖项

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

go fmt -mod=vendor ./... # has a bug slated to be fixed in go1.15
go generate -mod=vendor ./...
go build -mod=vendor ./...
Run Code Online (Sandbox Code Playgroud)

这包括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

// ...
Run Code Online (Sandbox Code Playgroud)


and*_*dig 4

https://github.com/golang/go/issues/25922证明对我有帮助,尤其是

当使用模块的仅构建依赖项时,要点是版本选择(而不是安装这些!)

为了避免安装,您可以将 //go:generate 指令修改为:

//go:generate go run golang.org/x/tools/cmd/stringer ARGS
Run Code Online (Sandbox Code Playgroud)

还有最佳实践存储库:https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md