`cmd/go: "mod why"` 应该显示包或模块的所有路径,

cvxl0en2  于 2个月前  发布在  Go
关注(0)|答案(6)|浏览(30)

如果 go mod why 能提供一个包或模块的所有路径,而不仅仅是最短路径,那就更好了。这将有助于回答诸如“要移除依赖项 X 需要什么?”这样的常见问题。
我可以通过 go list -deps -jsongo mod graph 间接获取这些信息,通过某种方式处理或绘制输出。甚至可以使用第三方工具,如 https://github.com/loov/goda
尽管如此,我认为这个相对简单的更改将使 go mod why 在简单的用例中显著提高实用性,而无需涉及更复杂的内容,如图表或依赖关系查询语言。

ibrsph3r

ibrsph3r1#

虽然如此,我认为某种查询语言也非常有用,但这两个功能可以并且应该共存。而且对于查询语言存在于第三方工具中也是可以接受的。

bkhjykvo

bkhjykvo2#

这个语法有点复杂。对于单条路径,输出可以仅仅是沿着路径的节点(包)。对于完整的导入子图,我们可能需要一种方法来显示边。
但是我想go mod graph已经有一种表示边的方式了......

ac1kyiln

ac1kyiln3#

我最初的想法是将换行符分隔的输出扩展为可能包含许多空行分隔组的形式:

$ go mod why baz
foo
bar
baz

foo
some-other-bar
baz

另一种选择可能是利用 go mod graph 边缘格式,这样我们只需显示到达目的地的所有路径的子图:

$ go mod why baz
foo bar
bar baz
foo some-other-bar
some-other-bar baz

我个人更喜欢第一种,因为我觉得它更容易被人类理解。

drnojrws

drnojrws4#

我认为在一般情况下,组是不可行的:即使忽略循环(在构建约束下是可能的),在最坏的情况下,唯一路径的数量与节点数量成指数关系。

xu3bshqb

xu3bshqb5#

那么,或许答案是提供一个 go mod graph ,它输出的是包导入图,而不是模块依赖关系图。然后,可以根据需要进行可视化、查询或检查。
可以通过 go list -deps -json all 获取这些信息,但需要更多的工作。任何目前理解 go mod graph 输出的工具都可以轻松地开箱即用。

htrmnn0y

htrmnn0y6#

额外的思考 - go mod graph 的包变体应该接受通常的构建标志和参数。为了示例的目的,使用 go-pkg-graph 作为占位符:

# the entire graph for all packages here
go-pkg-graph ./...

# only the sub-graph with the current main package at its root
go-pkg-graph

# same as the above, but with different build params
GOOS=windows go-pkg-graph -tags=purego

相关问题