go - go modules 如何与可安装命令一起使用?

标签 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 resetrm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod 并发现 go mod tidy 本身做得很好。

销售

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

go mod vendor

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

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

go fmt -mod=vendor ./... # has a bug slated to be fixed in go1.15
go generate -mod=vendor ./...
go build -mod=vendor ./...

这包括 go buildgo getgo install 调用的任何 go run >go generate(甚至 go generate 本身)

//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package main

// ...

关于go - go modules 如何与可安装命令一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52428230/

相关文章:

go - VSCODE gopath 不同于 shell 中设置的 GOPATH

http - Golang : http server leaving open goroutines

go - 在不与参数类型紧密耦合的情况下将参数传递给函数的最佳方法是什么?

go - 如何将东坐标北坐标转换为经纬度?

mysql - Go 中的 MySQL 错误

golang tabwriter 格式不正确

json - Golang 空类型和 json.Decode()

go - 有没有办法在golang的一个进程中运行多个命令 "os/exec"?

testing - 如何在 Golang 中将数据发送到 channel 以进行测试?

bash - golang - 在空的 bash 窗口中打开文件