安装 All Go Mod 依赖二进制文件

Installing All Go Mod Dependency Binaries

我正在使用带有此工具文件的 go1.16.3 来整合依赖项:

// +build tools

package main

import (
    _ "github.com/swaggo/swag/cmd/swag"
    _ "honnef.co/go/tools/cmd/staticcheck"
)
项目目录中的

运行 go get 将软件包下载并安装到 $GOPATH/pkg/mod,但不会将它们的二进制文件安装到 $GOPATH/bin。 运行 go get 分别为每个 mod(即 go get github.com/swaggo/swag/cmd/swag 安装软件包和二进制文件。

有没有办法用一条命令为所有 mod 安装二进制文件?

如果没有,自动安装所有依赖项的所有包和二进制文件的正确方法是什么?

没有真正的好方法可以在单个命令中执行此操作。你最好的选择可能是一个脚本,它链接一个 go list 命令以列出从 tools.go 到 go install 命令的所有导入:

tools=$(go list -f '{{range .Imports}}{{.}} {{end}}' tools.go)
go install $tools

为了解释上面的内容,go list 查询包和模块。默认情况下,它只打印包名,但它的输出可以用 -f-json 控制。 go help list shows everything go list can print. The syntax for -f is the same as text/template.

所以在这里,go list tools.go 查询一个包,它是一个 .go 文件列表,在这种情况下,只是 tools.go。 .Imports 是从该包导入的经过排序、去重的列表。我们可以只使用模板 {{.Imports}},但它会在开头和结尾打印括号。

$ go list -f '{{.Imports}}' tools.go
[github.com/swaggo/swag/cmd/swag honnef.co/go/tools/cmd/staticcheck]

因此,我们的范围超过 .Imports,并在范围内打印每个导入 ({{.}}),然后是 space。