【问题标题】:Getting all dependencies of a Go project获取 Go 项目的所有依赖项
【发布时间】:2021-07-08 04:20:41
【问题描述】:

对于我的项目,我正在尝试获取项目的所有依赖项和子依赖项。我需要每个依赖项的特定版本。我不仅需要我的项目的依赖,还需要依赖的依赖等等直到root。

对于我的项目,go list -m all 适用于除了没有选择使用 go.mod 文件的间接依赖项之外的所有内容。现在我的工作流程是获取第一批存储库,从 git 下载它们,然后使用“GO111MODULE=on go build ./...”。和“GO111MODULE=on go list -m -json all”获取依赖列表。我不检查 go.mod,因为我正在扫描的所有存储库都使用 go.mod 文件。

对于这个初始列表中的依赖项列表,我有一些疑问,对于没有 go.mod 文件的文件,我将其用作参考:“https://blog.golang.org/using-go-modules

-Path = 接收自go list -m all,可以是 GitHub、gopkg 或任何用于 dl 的 go 包。

没有 go.mod

-“GO111MODULE=on go mod init <PATH from parent go.mod>”

-“GO111MODULE=on go build ./…”

-“GO111MODULE=on go mod tidy”

-“GO111MODULE=on go list -m -json all”

-From there I get a list of the dependencies of this module. 

使用 go.mod

-“GO111MODULE=on go build ./…”

-“GO111MODULE=on go mod tidy”

-“GO111MODULE=on go list -m -json all”

我应该在每个具有 go.mod 文件的依赖项上运行 go build 吗?对于没有 go.mod 文件的人,我知道应该这样做,因为我们将如何使用依赖项填充 go.mod 文件。但是对于带有 go.mod 文件的文件,我是否会通过 go build 提取我的项目不一定使用的额外内容,例如测试文件和其他在我只是导入该项目时可能不会使用的文件?我知道获得更多未使用的依赖项而不是丢失一些依赖项更好,但是依赖项的数量之多让我有点不知所措。

【问题讨论】:

  • go list 无论包是否是模块都有效,只是不要使用 -m 标志。对于其余的问题:没有什么可担心的,一切正常。未使用的依赖项不是问题,包内但在构建期间未使用的东西也不是要担心的问题。
  • 理解这个问题有些困难。我认为答案是“不,我认为你不应该在每个使用 go 模块的 dep 上运行 go build”。或许你能从这里更好地理解为什么:github.com/golang/go/wiki/…
  • 使用 go list 的问题是它没有显示使用的依赖的版本,这是我需要的,也是我使用 -m 标签的原因
  • 它没有非模块依赖版本的概念。它只理解模块的版本。

标签: go


【解决方案1】:

我可以尝试分析go.sum文件(当你执行go list -u时,go.sum被创建了)

go 命令使用 go.sum 文件来确保这些模块的未来下载检索到与第一次下载相同的位,以确保您的项目所依赖的模块不会意外更改,无论是恶意的、意外的还是其他原因。 go.mod 和 go.sum 都应该检查到版本控制中。 (Using Go Modules - Adding a dependency)

go.sum 文件列出了模块所需的直接和间接依赖的校验和(和版本标签)。

% cat go.sum
...
github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q=
github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
...

【讨论】:

    【解决方案2】:

    不幸的是,“所有依赖项”这个短语是模棱两可的。

    go list -m 列出了其选定版本由您的go.mod 文件确定的所有模块。这是“所有依赖项”的一个可能定义,但它是一组比我认为大多数人在谈论模块的“依赖项”时想要的更广泛的模块。

    在实践中,go list -test all(没有 -m 标志)是我通常关心的最广泛的依赖项:它包括您模块中 import 语句中列出的所有包(即您需要的所有内容)为了在你的模块中运行go test ./...),加上在这些包上运行go test所需的所有包。

    (特别是,go list -test all 也是您运行go mod tidy 时将解析的一组包。)

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2012-03-30
      • 2021-02-15
      • 2022-06-27
      • 1970-01-01
      相关资源
      最近更新 更多