x/tools/go/packages: "files="查询似乎不起作用

gudnpqoy  于 5个月前  发布在  Go
关注(0)|答案(3)|浏览(50)

你正在使用的Go版本是什么(go version)?

go version go1.20.1 linux/amd64

这个问题在最新版本的发布中是否会重现?
是的

你做了什么?
x/tools/go/packages被记录为需要一个特殊的查询来获取包含一组Go源文件的包列表。在我的所有测试中,基于文件的查询总是返回零个包。
这是一个小示例程序:https://github.com/cespare/misc/blob/main/pkgfilesquery/pkgfilesquery.go
如果你想运行这个,克隆仓库,然后从仓库根目录运行

go run ./pkgfilesquery

你期望看到什么?

packages.Load returned 1 packages
github.com/cespare/misc/columns

但实际上你看到了什么?

packages.Load returned 0 packages

我尝试了各种方法,包括绝对路径,但我总是得到零个包。
如果我使用正常的Go list模式,如./columnsgithub.com/cespare/misc/columns,而不是一个file=查询,那么它就可以正常工作。
我简要跟踪了x/tools/go/packages的内部工作原理,看起来代码最初得到了正确的包集合,但没有"根",然后后续的"细化"步骤将包列表过滤为零。
这里还有一个文档问题。文档上说:
查询 "file=path/to/file.go" 匹配包围 Go 源文件 path/to/file.go 的包或包。例如 "file=~/go/src/fmt/print.go" 可能返回 "fmt" 和 "fmt [fmt.test]"。
但是(a)它没有说明如何解析文件名(它们是相对于当前工作目录还是config.Dir?)(b)它暗示 ~ 可能起作用,但我没有看到任何证据表明 ~ 在代码中已经实现。
@matloob,根据s/owners的信息,仓库的所有者

jjhzyzn0

jjhzyzn01#

我的同事指出,如果我添加了 packages.NeedFiles 模式标志,它就可以正常工作。但据我所知,这些标志应该控制返回的包中填写哪些字段,而不是返回哪些包。因此,files= 查询与某些模式之间的交互似乎存在一个bug。

ki0zmccv

ki0zmccv2#

CC @matloob, @golang/tools-team。

5lhxktic

5lhxktic3#

https://go.dev/cl/588141提到了这个问题:go/packages: document fields that are part of JSON schema

相关问题