Golang在build时是否会自动下载依赖?

Golang在build时是否会自动下载依赖? 抱歉问一个新手问题,但我原本的理解是 go build 应该会自动下载依赖项,但对我来说,它却要求使用 go get 来下载。一旦我下载了依赖项,它就能顺利构建。

我使用的是 Go 版本 1.21.3

go % go version
go version go1.21.3 darwin/arm64
7 回复

嗯,这确实很有趣。

更多关于Golang在build时是否会自动下载依赖?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Dean_Davidson:

go install 也可以下载模块。

确实如此,但这主要是构建和安装二进制文件时产生的附带效果。

你好,@Aaron_Stromas,欢迎来到论坛。

根据我的经验,我认为只有 go getgo mod tidygo mod download 可以从远程仓库下载模块。

其他工具,尤其是编译器,不会将模块路径解释为仓库 URL。

或者,这就是我曾在某处读到的内容。然而,我在文档中没有找到任何可以证实我观察的内容。

根据我的经验,我认为只有 go getgo mod tidygo mod download 可以从远程仓库下载模块。

go install 也可以下载模块。我同意 go build 不应该自动下载依赖。我认为 Go 开发者会认为这是侵入性的;特别是那些通过 vendoring 依赖来严格控制它们的人。

请查看 go build 的文档:

go command - cmd/go - Go Packages

Go 是一个用于管理 Go 源代码的工具。

谢谢,@christophberger@Dean_Davidson。我正在阅读 J. Bodner 的 O’Reiley 书籍《LearningGo》,书中似乎暗示包会自动下载。

$ go build
go: finding module for package github.com/learning-go-book/simpletax
go: finding module for package github.com/shopspring/decimal
go: downloading github.com/learning-go-book/simpletax v1.1.0
go: found github.com/learning-go-book/simpletax in
github.com/learning-go-book/simpletax v1.1.0
go: found github.com/shopspring/decimal in github.com/shopspring/decimal v1.2.0

但这在我这里没有发生,所以我怀疑我的环境设置可能有问题。 谢谢两位。

抱歉回复晚了。我猜你用的是第一版吧?

在第二版(早期发布版,计划于24年1月出版)中,步骤已经修正:

$ go get ./...
go: downloading github.com/learning-go-book-2e/simpletax v1.1.0
go: added github.com/learning-go-book-2e/simpletax v1.1.0
go: added github.com/shopspring/decimal v1.3.1
$ go build

第一版: First edition

第二版: Second edition

在 Go 1.16 及更高版本中,go build 默认不会自动下载依赖项。它依赖于 go.mod 文件中记录的依赖项及其版本,并且期望这些依赖项已经存在于本地模块缓存中(通常位于 $GOPATH/pkg/mod)。

如果你还没有下载依赖项,可以通过以下任一方式获取它们:

  1. 使用 go mod tidy(推荐):
    这会下载 go.mod 中记录的所有依赖项,并清理未使用的依赖项。

    go mod tidy
    
  2. 使用 go mod download
    仅下载依赖项到本地缓存,不修改 go.modgo.sum

    go mod download
    
  3. 使用 go get
    可以下载特定依赖项,但也会更新 go.mod。如果你只是想下载所有依赖项,通常使用上述命令更合适。

    go get ./...
    

示例流程

# 1. 初始化模块(如果尚未初始化)
go mod init example.com/myapp

# 2. 添加依赖项到代码后,运行以下命令下载依赖
go mod tidy

# 3. 构建项目
go build

注意go build 在以下情况下会自动下载依赖项:

  • 当使用 -mod=mod 标志时(例如 go build -mod=mod)。
  • 在 Go 1.15 及更早版本中,默认行为是自动下载。

因此,你遇到的情况是正常的。建议在构建前先运行 go mod tidy 来确保依赖项已下载并同步。

回到顶部