x/tools/go/analysis/internal: 添加一个选项,用于为外部包发出诊断信息,

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

你正在使用的golang/tools的版本是什么?

~/tools $ git rev-parse HEAD
a30bf2db82d4f645ded9030efbbf6d4fbe5e70eb

建议
目前,在 golang/tools 中的分析驱动程序仅对根包打印诊断信息。如果不更改 golang/tools 存储库或从头开始开发驱动程序,我们无法改变这种行为,因为这种行为是写在 internal 包中的。
如果能够为依赖项发出诊断信息,某些分析可能会更有利,因为依赖项中的问题也可能是在根包中的问题。
因此,我想通过向 golang.org/x/tools/go/analysis/internal/checker.Run 添加参数以及向 golang.org/x/tools/go/analysis/singlechecker.Rungolang.org/x/tools/go/analysis/multichecker.Run 添加命令行参数来实现为外部包发出诊断信息的功能。这样可以吗?还是有其他原因导致该选项不在这些包中?
谢谢。

rnmwe5a2

rnmwe5a21#

@matloob @alandonovan

hfsqlsce

hfsqlsce2#

(通过“外部包”,我假设你指的是依赖关系。)
驱动程序仅在需要从分析较低级别的包中获取事实时,才在依赖项上运行请求的分析器(以及由于 Requires 间接需要的任何内容);大多数分析器实际上不需要查看除根之外的其他包。
这个命令的某个变体不就能做到你需要的吗?

$ go vet $(go list -deps myproj/...)
kognpnkq

kognpnkq3#

@matloob, @alandonovan
我测试了命令并理解了这个解决方法(递归地对所有依赖项进行lint检查)。非常感谢您的建议🙇
然而,我发现了一些差异。
我将这个解决方法与my copied and modified driver进行了比较,如下所示。

# with modified driver
~/knil$ time knil golang.org/x/tools/... 2>&1 | wc -l
   15800

real    0m18.837s
user    0m47.938s
sys     0m4.163s

# with `go list -deps`
~/knil$ time knil $(go list -deps golang.org/x/tools/...) 2>&1 | wc -l
   15159

real    0m45.245s
user    1m41.810s
sys     0m14.848s

我不知道wc返回的行数差异的原因(可能是依赖项版本之间的差异?),但是性能差异可能是因为当前驱动程序会同时以根和依赖项的方式双重检查依赖项。
这种性能差异可能无法通过这个解决方法来解决,我们应该准备优化分析的选项吗?

jgovgodb

jgovgodb4#

感谢报告。我对它变慢并不感到惊讶。区别在于:

  1. 默认命令在根包上运行所有分析,并在所有依赖项上运行模块分析(少数使用事实的分析)。然后仅报告根包的诊断信息。
  2. 您的fullchecker也执行相同的操作,但为依赖项报告诊断信息。这些将必然只包括模块分析产生的诊断信息。
  3. 'go list'的解决方法对所有包运行所有分析并打印所有诊断信息。
    #1#3 很容易解释。#2 则不容易。这就是为什么我不想添加一个标志的原因。
    如果您有动力的话,对 #3 进行性能分析是个好主意,看看是否可以轻松地提高性能。

相关问题