x/tools/go/packages: "-: 无法在任何地方找到名为"nonexist"的包,"

bmp9r5qi  于 4个月前  发布在  Go
关注(0)|答案(6)|浏览(40)

当我运行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

4dc9hkyq

4dc9hkyq1#

cc @stamblerre
错误与文件中的位置相关联,如果没有位置,错误将使用 - 打印。请参阅此处的错误文档:https://pkg.go.dev/golang.org/x/tools/go/packages?tab=doc#Error
由于错误已经与包关联,因此错误不会打印其自己的包以避免冗余。

1cklez4t

1cklez4t2#

我们能否让"go build"遵循相同的约定?即,让它打印"-:"而不是"package nonexist:"?

k75qkfdt

k75qkfdt3#

我不知道在这里这样做是否正确:与go包更接近的类似物是go list -e -json,使用这些你得到一个非常相似的结果:

$ go list -e -json nonexist
{
	"ImportPath": "nonexist",
	"Match": [
		"nonexist"
	],
	"Incomplete": true,
	"Error": {
		"ImportStack": [
			"nonexist"
		],
		"Pos": "",
		"Err": "package nonexist is not in GOROOT (/usr/local/go/src/nonexist)"
	}
}
b1payxdu

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() |

6yt4nkrj

6yt4nkrj5#

我认为 -: 不是一个特别有帮助的前缀。(对工具可能有帮助,但对人类来说可能会令人困惑。)

话虽如此,package nonexist: cannot find package "nonexist" 也显得多余且令人不悦。在模块模式下,这个错误信息比在 GOPATH 模式下要流畅得多:

example.com$ GO111MODULE=on go build nonexist
package nonexist is not in GOROOT (/usr/local/google/home/bcmills/sdk/gotip/src/nonexist)

example.com$ GO111MODULE=off go build nonexist
package nonexist: cannot find package "nonexist" in any of:
        /usr/local/google/home/bcmills/sdk/gotip/src/nonexist (from $GOROOT)
        /tmp/tmp.00bJBNCJEL/_gopath/src/nonexist (from $GOPATH)

如果有人想修复 GOPATH 模式下的错误消息以匹配模块模式下的错误消息,那似乎是个改进,但除非我们在模块模式下看到类似的情况,否则我不认为值得花太多时间在这上面。

7uzetpgm

7uzetpgm6#

在go/packages方面,我们可以做的一件事就是在错误的String方法中去掉"-:"。如果包?

相关问题