go - go 模块如何使用可安装的命令?
问题描述
我最近开始使用 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
(fileb0x 是我要添加的东西)
我不是 100% 清楚修复它的事件顺序,但我做了所有这些事情:
使用“工具”包
我做了一个tools
目录:
mkdir -p internal/tools
我把工具包放在里面(如上所述):
internal/tools/tools.go
:
// +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 命令以-mod=vendor
在任何Makefile
s、Dockerfile
s 或其他脚本中使用。
go fmt -mod=vendor ./... # has a bug slated to 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
// ...
推荐阅读
- java - 非唯一列一到多映射上的休眠映射
- mongodb - 带有嵌套 DBRefs 的 Mongo 查找
- plot - 如何使用 Makie 的流图为时变函数设置动画?
- python - TypeError numpy.ndarray with scipy.optimize.minimize('numpy.ndarray'对象不可调用)
- css - 无法正确显示手风琴折叠
- asp.net - 为什么我们需要在 asp.net 中将 varchar 更改为字符串?
- excel - VB Script excel marco 以前可以工作,但现在不行
- python - 如何检查恒星时间是否存在或是否按顺序排列?
- html - 多个 DIV 的 CSS 悬停效果不起作用
- php - 如何修复此 php 电子邮件提交表单?