你正在使用的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模式,如./columns
或github.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的信息,仓库的所有者
3条答案
按热度按时间jjhzyzn01#
我的同事指出,如果我添加了
packages.NeedFiles
模式标志,它就可以正常工作。但据我所知,这些标志应该控制返回的包中填写哪些字段,而不是返回哪些包。因此,files=
查询与某些模式之间的交互似乎存在一个bug。ki0zmccv2#
CC @matloob, @golang/tools-team。
5lhxktic3#
https://go.dev/cl/588141提到了这个问题:
go/packages: document fields that are part of JSON schema