在 golang 中查找每个依赖项的校验和

Find checksum of every dependency in golang

我希望能够获取 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的信息。我相信这是因为pkgBpkgA都属于同一个模块。

问题:有什么方法可以访问 pkgA 的校验和吗?

Go 校验和数据库存储模块的校验和,而不是包。 嵌入在二进制文件中的调试信息不​​包括从包到模块的映射,但如果您有权访问模块的源代码,则可以使用 go list 报告从包到模块的映射:

go list -f '{{if .Module}}{{.ImportPath}}: {{.Module}}{{end}}' all

您可以将该映射与模块级校验和结合使用,以验证每个包是否具有正确的源代码。 (请注意 go mod verify 已经实施了该验证。)