Golang中使用go mod时依赖包保存在哪里
Golang中使用go mod时依赖包保存在哪里 我按照以下步骤在 Go 模块中运行测试。在这个过程中,我有几个问题需要澄清。
- 进入目录
/tmp/gomodtry/tests/src/hello/hello_test.go
包名:tests
import (
"github.com/stretchr/testify/assert"
"os"
"testing"
)
func GetEnv(key string, fallback string) string {
envVariable := os.Getenv(key)
if envVariable == "" {
return fallback
}
return envVariable
}
func TestHello(t *testing.T) {
val := GetEnv("check", "ok")
assert.Equal(t, "ok", val, "val is not equal to ok")
}
func TestHello1(t *testing.T) {
val := GetEnv("check", "ok")
assert.Equal(t, "ok", val, "val is not equal to ok")
}
-
设置环境变量
export GO111MODULE=on -
运行
go test ./...
这会在/tmp/gomodtry/目录下创建 go.mod 和 go.sum 文件
当我再次执行go test ./... -v时,测试成功执行。
问题:
依赖项 github.com/stretchr/testify/assert 下载到了哪里?我没有看到它被下载到任何地方。在使用 Go 模块概念之前,当我们设置 GOPATH 然后使用 go get 获取依赖时,它会实际下载到本地。请解释测试是如何解析依赖的,即使它实际上并不存在于本地。
在之前的版本中,当我们使用 go get 获取依赖时,有时会遇到 500 错误,因为依赖所在的主机可能会暂时宕机。在使用 Go 模块概念后,我们是否还会遇到这类问题?它是如何处理的?[我们不喜欢对依赖进行 vendor 处理,所以最终每次测试运行都要执行 go get,当主机宕机时,这使我们的测试运行变得不稳定]
更多关于Golang中使用go mod时依赖包保存在哪里的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中使用go mod时依赖包保存在哪里的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 模块中,依赖包被下载并缓存在 Go 模块缓存目录中,默认路径是 $GOPATH/pkg/mod(如果设置了 GOPATH)或 $HOME/go/pkg/mod(如果未设置 GOPATH)。你可以通过运行 go env GOMODCACHE 命令查看确切的缓存位置。
在运行 go test ./... 时,Go 工具链会自动解析 go.mod 中的依赖,并将它们下载到模块缓存中。依赖不会出现在你的项目目录中,而是集中存储在缓存目录。例如,github.com/stretchr/testify/assert 会被下载到类似 $GOPATH/pkg/mod/github.com/stretchr/testify@v<version>/assert 的路径中。
以下是一个简单的示例,展示如何检查依赖缓存:
# 查看模块缓存路径
go env GOMODCACHE
# 列出缓存的依赖
ls $(go env GOMODCACHE)/github.com/stretchr/testify@*
关于依赖解析和网络问题:Go 模块使用内容寻址存储和校验和验证(通过 go.sum 文件)。一旦依赖被成功下载并缓存,后续构建或测试将直接使用缓存副本,无需重新下载。这减少了因远程主机宕机导致的失败。如果依赖未被缓存,Go 会尝试从配置的模块代理(如 proxy.golang.org)或原始仓库下载。模块代理提供了冗余,降低了直接依赖原始主机的不稳定性。
如果模块代理不可用,Go 会回退到直接访问原始仓库。你可以通过设置 GOPROXY 环境变量配置多个代理或直接模式(例如 GOPROXY=direct),但推荐使用默认代理以提高可靠性。例如:
# 使用多个代理(逗号分隔)和直接回退
export GOPROXY=https://proxy.golang.org,direct
总之,Go 模块的缓存机制和代理支持减少了因网络问题导致的测试不稳定,避免了每次运行都执行 go get。

