当我运行go build nonexist
时,得到:
package nonexist: cannot find package "nonexist" in any of:
/home/mdempsky/wd/go/src/nonexist (from $GOROOT)
/home/mdempsky/go/src/nonexist (from $GOPATH)
但是使用go/packages.Load和go/packages.PrintErrors(完整代码如下),得到:
-: cannot find package "nonexist" in any of:
/home/mdempsky/wd/go/src/nonexist (from $GOROOT)
/home/mdempsky/go/src/nonexist (from $GOPATH)
是否有一些解析器代码认为"package nonexist:"不是一个有效的源位置,所以它被Map到"-:"?
演示代码:
package main
import "golang.org/x/tools/go/packages"
func main() {
cfg := &packages.Config{Mode: packages.NeedName}
pkgs, err := packages.Load(cfg, "nonexist")
if err != nil {
panic(err)
}
packages.PrintErrors(pkgs)
}
/cc @matloob @heschik
6条答案
按热度按时间4dc9hkyq1#
cc @stamblerre
错误与文件中的位置相关联,如果没有位置,错误将使用
-
打印。请参阅此处的错误文档:https://pkg.go.dev/golang.org/x/tools/go/packages?tab=doc#Error由于错误已经与包关联,因此错误不会打印其自己的包以避免冗余。
1cklez4t2#
我们能否让"go build"遵循相同的约定?即,让它打印"-:"而不是"package nonexist:"?
k75qkfdt3#
我不知道在这里这样做是否正确:与go包更接近的类似物是
go list -e -json
,使用这些你得到一个非常相似的结果:b1payxdu4#
看起来cmd/go的"package nonexist:"输出来自:
go/src/cmd/go/internal/load/pkg.go
第396行 in a55645f
| | return"package "+strings.Join(p.ImportStack, "
\timports ") +optpos+": "+p.Err.Error() |
6yt4nkrj5#
我认为
-:
不是一个特别有帮助的前缀。(对工具可能有帮助,但对人类来说可能会令人困惑。)话虽如此,
package nonexist: cannot find package "nonexist"
也显得多余且令人不悦。在模块模式下,这个错误信息比在 GOPATH 模式下要流畅得多:如果有人想修复 GOPATH 模式下的错误消息以匹配模块模式下的错误消息,那似乎是个改进,但除非我们在模块模式下看到类似的情况,否则我不认为值得花太多时间在这上面。
7uzetpgm6#
在go/packages方面,我们可以做的一件事就是在错误的String方法中去掉"-:"。如果包?