首页 > 解决方案 > go 模块如何使用可安装的命令?

问题描述

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

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

标签: go

解决方案


如果你得到一个错误

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

// ...

推荐阅读