我希望能够获得go程序使用的每个包的校验和,包括模块内使用的包。
标准库中的runtime/debug
有ReadBuildInfo()
,这很好,但它只提供模块的数据,而不是包的数据。
的例子:
package pkgA
var Foo = 1
package pkgB
import "pkgA"
var Bar = pkgA.Foo
package main
import (
"fmt"
"runtime/debug"
"example/pkgB"
)
func main() {
_ = pkgB.Bar
b, ok := debug.ReadBuildInfo()
if !ok {
fmt.Println("not ok!")
return
}
for _, module := range b.Deps {
fmt.Println(module.Path, module.Sum)
}
}
输出如
pkgB v0.0.0-20210225235400-92e28d816f64
没有关于a的信息,我相信这是因为pkgB
和pkgA
都属于同一个模块。
:是否有办法访问pkgA
的校验和?
Go校验和数据库存储模块的校验和,而不是包。二进制文件中嵌入的调试信息不包括从包到模块的映射,但是如果您可以访问模块的源代码,您可以使用go list
报告从包到模块的映射:
go list -f '{{if .Module}}{{.ImportPath}}: {{.Module}}{{end}}' all
您可以将该映射与模块级校验和结合使用,以验证每个包是否具有正确的源代码。(注意go mod verify
已经实现了这个验证。)