0

我希望能够获得 go 程序使用的每个包的校验和,包括模块中使用的包。

runtime/debug在标准库中 has 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吗?

4

1 回答 1

1

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

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

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

于 2021-10-19T16:36:20.317 回答