如何查看嵌套 Go 依赖项的完整依赖项树

Cha*_*lie 11 build go dependency-management

我正在尝试在我们的 CI 中调试以下构建错误,其中“A 依赖于 B,它无法构建,因为它依赖于 C。” 我正在构建不直接依赖于 kafkaAvailMonitor.go 的数据服务,这使得此错误难以追踪。换句话说:

数据(我正在构建的)取决于(?),这取决于 kafkaAvailMonitor.go

对于开发人员来说,修复他们只是“去做任何事情”似乎微不足道,但作为发布过程的一部分,我不能这样做 - 我必须找到添加依赖项的人并要求他们修复它。

我知道有一些工具可以可视化依赖树和其他更复杂的构建系统,但这似乎是一个非常基本的问题:有什么方法可以查看完整的依赖树以查看导致构建问题的原因吗?

go build -a -v

../../../msgq/kafkaAvailMonitor.go:8:2: cannot find package 
  "github.com/Shopify/sarama/tz/breaker" in any of:
  /usr/lib/go-1.6/src/github.com/Shopify/sarama/tz/breaker (from $GOROOT)
  /home/jenkins/go/src/github.com/Shopify/sarama/tz/breaker (from $GOPATH)
  /home/jenkins/vendor-library/src/github.com/Shopify/sarama/tz/breaker
  /home/jenkins/go/src/github.com/Shopify/sarama/tz/breaker
  /home/jenkins/vendor-library/src/github.com/Shopify/sarama/tz/breaker
Run Code Online (Sandbox Code Playgroud)

Bry*_*yan 15

使用模块时,您可能能够从go mod graph.

usage: go mod graph

Graph prints the module requirement graph (with replacements applied)
in text form. Each line in the output has two space-separated fields: a module
and one of its requirements. Each module is identified as a string of the form
path@version, except for the main module, which has no @version suffix.
Run Code Online (Sandbox Code Playgroud)

即,对于原始问题,运行go mod graph | grep github.com/Shopify/sarama然后更仔细地查看左侧的每个条目。


Von*_*onC 10

如果以下不是堆栈跟踪,那是什么?

它是 Go 正在寻找丢失的包的路径列表。

我不知道谁在导入 kafkaAvailMonitor.go

它不是“导入”的,只是源代码的一部分并已编译。
除非它无法编译,因为它需要github.com/Shopify/sarama/tz/breaker, 不在GOROOT或 中GOPATH

不过,请检查您的直接包装上go list会返回什么,看看是否kafkaAvailMonitor提到了。

go list 可以显示您的包直接依赖的包,或其完整的传递依赖集。

% go list -f '{{ .Imports }}' github.com/davecheney/profile
[io/ioutil log os os/signal path/filepath runtime runtime/pprof]
% go list -f '{{ .Deps }}' github.com/davecheney/profile
[bufio bytes errors fmt io io/ioutil log math os os/signal path/filepath reflect run
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写 go list 脚本以列出所有依赖项。例如
请参阅Noel Cower ( ) 的这个 bash 脚本nilium

#!/usr/bin/env bash
# Usage: lsdep [PACKAGE...]
#
# Example (list github.com/foo/bar and package dir deps [the . argument])
# $ lsdep github.com/foo/bar .
#
# By default, this will list dependencies (imports), test imports, and test
# dependencies (imports made by test imports).  You can recurse further by
# setting TESTIMPORTS to an integer greater than one, or to skip test
# dependencies, set TESTIMPORTS to 0 or a negative integer.

: "${TESTIMPORTS:=1}"

lsdep_impl__ () {
    local txtestimps='{{range $v := .TestImports}}{{print . "\n"}}{{end}}'
    local txdeps='{{range $v := .Deps}}{{print . "\n"}}{{end}}'

    {
        go list -f "${txtestimps}${txdeps}" "$@"
        if [[ -n "${TESTIMPORTS}" ]] && [[ "${TESTIMPORTS:-1}" -gt 0 ]]
        then
            go list -f "${txtestimps}" "$@" |
            sort | uniq |
            comm -23 - <(go list std | sort) |
                TESTIMPORTS=$((TESTIMPORTS - 1)) xargs bash -c 'lsdep_impl__ "$@"' "$0"
        fi
    } |
    sort | uniq |
    comm -23 - <(go list std | sort)
}
export -f lsdep_impl__

lsdep_impl__ "$@"
Run Code Online (Sandbox Code Playgroud)

  • @Fli 因此该脚本是为了列出所有包的所有依赖项,以便找到导入 `kafkaAvailMonitor` 的包 (2认同)

小智 10

我只想在这里提一下,这go mod why也可以提供帮助。无论如何,你无法获取并显示整棵树。但是您可以追溯到子依赖项的一个分支,直到其父根。

例子:

$ go mod why github.com/childdep
# github.com/childdep
github.com/arepo.git/service
github.com/arepo.git/service.test
github.com/anotherrepo.git/mocks
github.com/childdep
Run Code Online (Sandbox Code Playgroud)

这意味着,您最终已在“anotherrepo.git/mocks”中导入了“childdep”。


小智 8

可以尝试这个https://github.com/vc60er/deptree

\n
 redis git:(master) go mod graph | deptree -d 3\npackage: github.com/go-redis/redis/v9\ndependence tree:\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80 github.com/cespare/xxhash/v2@v2.1.2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/dgryski/go-rendezvous@v0.0.0-20200823014737-9f7001d12a5f\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/fsnotify/fsnotify@v1.4.9\n\xe2\x94\x82    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 golang.org/x/sys@v0.0.0-20191005200804-aed5e4c7ecf9\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/nxadm/tail@v1.4.8\n\xe2\x94\x82    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/fsnotify/fsnotify@v1.4.9\n\xe2\x94\x82    \xe2\x94\x82    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 golang.org/x/sys@v0.0.0-20191005200804-aed5e4c7ecf9\n\xe2\x94\x82    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gopkg.in/tomb.v1@v1.0.0-20141024135613-dd632973f1e7\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/onsi/ginkgo@v1.16.5\n\xe2\x94\x82    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/go-task/slim-sprig@v0.0.0-20210107165309-348f09dbbbc0\n\xe2\x94\x82    \xe2\x94\x82    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 github.com/davecgh/go-spew@v1.1.1\n\xe2\x94\x82    \xe2\x94\x82    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 github.com/stretchr/testify@v1.5.1\n\xe2\x94\x82    \xe2\x94\x82         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n
Run Code Online (Sandbox Code Playgroud)\n