繁体   English   中英

为什么我使用 golang 模块,并导入一个没有选择模块的模块,但是 go.sum 文件有 go.mod 文件哈希?

[英]why I use golang module, and import a module that is not opted in module, but go.sum file has go.mod file hash?

我现在使用 golang 1.13 并使用 go 模块。

但是,当我导入一个没有在 go 模块中选择的包(例如,a)时,在 go.sum 文件中仍然有两行。 Go 模块告诉我们“每个已知的模块版本都会在 go.sum 文件中生成两行。第一行给出模块版本文件树的哈希值。第二行将“/go.mod”附加到版本并给出仅模块版本(可能是合成的)go.mod 文件的哈希值。go.mod-only 哈希值允许下载和验证模块版本的 go.mod 文件,该文件是计算依赖图所必需的,而无需下载所有模块的源代码代码。”

https://tip.golang.org/cmd/go/#hdr-Module_downloading_and_verification )。

但是这个包不是一个模块,所以它没有 go.mod 文件? 例如,如果我导入不是模块的包调用“github.com/example/a”,在 go.sum 文件中,它仍然有这两行:

github.com/example/a v0.0.0-20190627063042-31896c4e4162 h1:rSqi2vQEpS+GAFKrLvmxzWW3OGlLI4hANnEf/ib/ofo=

github.com/example/a v0.0.0-20190627063042-31896c4e4162/go.mod h1:tcpxll8wcruwpPpWBbjAsWc1JbLHld/v9F+3rgLIr4c=

我的问题是,第二行是如何生成的?

go.sum包含特定模块版本内容的预期加密校验和。 每次使用依赖项时,如果缺少或需要匹配 go.sum 中的现有条目,则将其校验和添加到 go.sum。

每个包/模块都是依赖项,每个依赖项都意味着使用go.sum校验和进行维护,因此无论是包还是模块,都将对其进行维护。

源代码将相应地下载到$GOPATH/src目录中。

尝试 -

导致在go.sum文件中写入每个依赖项 sum 哈希。 一个与您的go.mod文件相关,另一个是从您导入的模块中导入的。 尝试运行go mod tidy以减少导入的模块,您的go.mod文件将包含一些//indirect import,这是您导入的模块内部使用的。

或许Golang源码可以解释原因:

func (r *codeRepo) legacyGoMod(rev, dir string) []byte {
    // We used to try to build a go.mod reflecting pre-existing
    // package management metadata files, but the conversion
    // was inherently imperfect (because those files don't have
    // exactly the same semantics as go.mod) and, when done
    // for dependencies in the middle of a build, impossible to
    // correct. So we stopped.
    // Return a fake go.mod that simply declares the module path.
    return []byte(fmt.Sprintf("module %s\n", modfile.AutoQuote(r.modPath)))
}

来自这里的代码: https : //github.com/golang/go/blob/acac535c3ca571beeb168c953d6d672f61387ef1/src/cmd/go/internal/modfetch/coderepo.go#L857

↓ VSCode 打开/usr/local/go/src

  1. 定位到cmd/go/internal/modfetch/coderepo.go ,给 func legacyGoMod添加断点
  2. 定位到cmd/go/internal/modfetch/coderepo_test.go ,按 F5
  3. 稍等片刻,停在断点处

VSCode 调试 Golang 源码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM