我最近开始使用Go 1.11,并且喜欢这些模块。除了运行时依赖之外,我还需要在构建期间(例如在期间)使用go模块go generate。
如何安装特定的构建依赖项(例如github.com/aprice/embed/cmd/embed)并从哪个文件夹运行该特定工具?是go get正确的工具吗?
我没有看到我想添加到 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 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)
https://github.com/golang/go/issues/25922证明对我有帮助,尤其是
当使用模块的仅构建依赖项时,要点是版本选择(而不是安装这些!)
为了避免安装,您可以将 //go:generate 指令修改为:
Run Code Online (Sandbox Code Playgroud)//go:generate go run golang.org/x/tools/cmd/stringer ARGS
还有最佳实践存储库:https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md