Я хочу перечислить модули (и их версии), которые скомпилированы в окончательном исполняемом файле (а не другие зависимости).
Я могу сделать это с помощью:
$ go build -o a.out
$ go version -m a.out
Но как это сделать с помощью списка go (с удобным выводом в формате JSON)?
Я пробовал это:
$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
Но в нем перечислены многие транзитивные зависимости, которые используются, например, только в тестовых наборах. Я не понимаю, как мне отфильтровать эти зависимости.
Вот пример проекта, чтобы увидеть проблему (доступен на игровой площадке Go):
main.go
:
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
main_test.go
:
package main
import (
"github.com/google/go-cmp/cmp"
"testing"
)
func TestHelloWorld(t *testing.T) {
if !cmp.Equal(1, 1) {
t.Fatal("FAIL")
}
}
go.mod
:
module play.ground
go 1.15
require github.com/google/go-cmp v0.5.2
$ go build -o hello ; go version -m hello
hello: go1.15
path play.ground
mod play.ground (devel)
$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
github.com/google/[email protected]
golang.org/x/[email protected]
Module
пакета было задокументированным. - person Flimzy   schedule 15.10.2020{{if not .Indirect}}{{.}}{{end}}
включает только прямые зависимости. - person icza   schedule 15.10.2020.Indirect
не исключает модули, которые используются в тестах. В моем примереgithub.com/google/[email protected]
указан вgo list
, но не используется в двоичном файле. - person dolmen   schedule 16.10.2020go list -deps -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}'
- person icza   schedule 16.10.2020