你正在使用的Go版本是什么( go version
)?
提示(go1.21-4d9beb2052)
这个问题在最新版本的发布中是否重现?
是的
你正在使用什么操作系统和处理器架构( go env
)?
darwin/amd64
你做了什么?
有一个包含两个包 a
和 b
的模块。 b
是主包。 a
错误地导入了 b
。
go.mod
module m
go 1.21
a/a.go
package a
import _ "m/b"
b/b.go
package main
func main() {}
运行 go list ./a ./b
。
你期望看到什么?
报告导入不可导入的包的错误,例如
a/a.go:3:8: import "m/b" is a program, not an importable package
m/a
m/b
你看到了什么?
没有错误,退出代码为0。
$ go list ./a ./b
m/a
m/b
$ echo $?
0
有趣的是, go list -test ./a ./b
报告了错误,尽管与测试文件无关(实际上没有测试文件)。文档似乎没有提到 -test
标志可以导致错误报告的不同行为。
还有一些其他错误在使用 go list
时没有被报告,但在使用 go list -test
时被报告。 https://cs.opensource.google/go/go/+/master:src/cmd/go/testdata/script/vendor_import.txt 是其中一个例子。 bad.go
和 invalid.go
包含了一些错误,但 go list
命令成功执行。
看起来不同的行为与指定 -test
时运行的这段代码 https://cs.opensource.google/go/go/+/master:src/cmd/go/internal/list/list.go;l=736-788 有关。
在处理 CL https://golang.org/cl/474236 时发现的。
9条答案
按热度按时间g9icjywg1#
https://go.dev/cl/477838提到了这个问题:
cmd/go: permit "go list" error in some tests
t98cgbkg2#
在CL https://golang.org/cl/474236之后,当列出多个软件包时,默认的-pgo=auto模式将导致此代码https://cs.opensource.google/go/go/+/master:src/cmd/go/internal/list/list.go;l=736-788运行,从而导致它报告错误。
go list -pgo=off ./a ./b
将恢复到之前的(Go 1.20)意外行为。xcitsw883#
我认为允许主包的空白导入是一种跟踪依赖关系的方法,例如在使用tools.go模式时。
ccgok5k54#
@seankhliao,
go mod tidy
允许它们这样做,但通常情况下,我们期望go list
在报告错误方面遵循go build
的规则,而go build
当然不会允许你显式地导入一个package main
。czq61nw15#
我通过另一个向量实现了这个功能,但类似。当我一开始就允许设置这个结构时,声称我不能列出它似乎很奇怪。这是一个破坏性的变化 - 它真的值得吗?
vnzz0bqm6#
@thockin,鉴于我们不了解为什么最初会出现不同的行为,我们无法轻松地恢复这种错误的行为。
go list
支持-e
标志以允许列出可能存在错误的软件包。如果-e
标志不允许go list
在此错误之后继续进行,请提交一个单独的问题。(go list -e
已经有很多错误,但我们一直在慢慢修复这些错误,希望我们能继续将其朝着更好的长期状态发展。)zbsbpyhn7#
我们在尝试使用go1.21rc2测试kubernetes时也遇到了这个问题:kubernetes/kubernetes#118996
-e
的解决方法似乎有效(kubernetes/kubernetes#119027),但我不确定从长远来看采用这种方法是否明智。67up9zun8#
你好。
我报告的另一个问题#62228已经被关闭为重复。但是在那里我提供了复现者,我认为它是由这个提交引起的:a5c7928
或者这实际上是一个单独的问题,而不是这个问题的重复吗?
cngwdvgl9#
@alexbozhenko,感谢你标记那个提交。这是一个有趣的线索,尽管它仍然不能真正解释为什么PGO更改似乎触发了这种行为。😅
但是我认为这将帮助我们进行调查。