在 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的信息。我相信这是因为pkgB
和pkgA
都属于同一个模块。
问题:有什么方法可以访问 pkgA
的校验和吗?
Go 校验和数据库存储模块的校验和,而不是包。
嵌入在二进制文件中的调试信息不包括从包到模块的映射,但如果您有权访问模块的源代码,则可以使用 go list
报告从包到模块的映射:
go list -f '{{if .Module}}{{.ImportPath}}: {{.Module}}{{end}}' all
您可以将该映射与模块级校验和结合使用,以验证每个包是否具有正确的源代码。 (请注意 go mod verify
已经实施了该验证。)
我希望能够获取 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
已经实施了该验证。)