【发布时间】:2020-03-13 03:27:03
【问题描述】:
假设您正在使用 Go 1.13 并设置一个为 Go Modules 初始化的项目。
$ mkdir my-project
$ cd my-project
$ git mod init github.com/bmuschko/my-project
您设置 GoCenter 或其他代理,而不是使用默认的 Google 代理来下载依赖项。
$ export GOPROXY=https://gocenter.io
下载依赖项后,Go 似乎不会跟踪原始代理。最后,无法知道或验证依赖项是来自 Google 代理、自定义代理还是直接来自源代码存储库。理论上,如果您在它们之间切换,即使您提取相同的版本,校验和也可能会因原始代理而异。
$ go get github.com/spf13/cobra
Go 是否将此信息存储在缓存中的某个位置?我找不到这个信息。任何建议将不胜感激。
【问题讨论】:
-
“理论上,如果您在它们之间切换,即使您提取相同的版本,校验和也可能会因原始代理而异。”为什么以及如何?
-
“下载依赖项后,Go 似乎不会跟踪原始代理。”这是真的,但它确实在 go.sum 中记录了校验和。只要校验和不变,代理是否发生变化真的很重要吗?
-
@Volker 只需稍微更改源代码并将其上传到具有相同语义版本的不同甚至相同的存储库,校验和就可能有所不同。易于复制...创建一个标签,例如v1.2.3 对于 GitHub 上的一个模块,更改代码并覆盖现有标签。
-
Yes, there is a database 独立于模块代理。但更重要的是,校验和写入 go.sum (应该签入),所以如果代理突然提供不同的代码,Go 会注意到并告诉你。只有在第一次安装模块时才需要依赖数据库。
-
我认为对于企业来说,即使校验和保持不变,起源也很重要。如果管道直接拉向 github 或 goproxy(具有清理策略),那么可重复性是有问题的。用户可以从 GitHub 中删除标签。
标签: go dependency-management go-modules go-packages