Golang在build时是否会自动下载依赖?
Golang在build时是否会自动下载依赖? 抱歉问一个新手问题,但我原本的理解是 go build 应该会自动下载依赖项,但对我来说,它却要求使用 go get 来下载。一旦我下载了依赖项,它就能顺利构建。
我使用的是 Go 版本 1.21.3
go % go version
go version go1.21.3 darwin/arm64
Dean_Davidson:
go install也可以下载模块。
确实如此,但这主要是构建和安装二进制文件时产生的附带效果。
你好,@Aaron_Stromas,欢迎来到论坛。
根据我的经验,我认为只有 go get、go mod tidy 和 go mod download 可以从远程仓库下载模块。
其他工具,尤其是编译器,不会将模块路径解释为仓库 URL。
或者,这就是我曾在某处读到的内容。然而,我在文档中没有找到任何可以证实我观察的内容。
根据我的经验,我认为只有
go get、go mod tidy和go 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
第一版:

第二版:

在 Go 1.16 及更高版本中,go build 默认不会自动下载依赖项。它依赖于 go.mod 文件中记录的依赖项及其版本,并且期望这些依赖项已经存在于本地模块缓存中(通常位于 $GOPATH/pkg/mod)。
如果你还没有下载依赖项,可以通过以下任一方式获取它们:
-
使用
go mod tidy(推荐):
这会下载go.mod中记录的所有依赖项,并清理未使用的依赖项。go mod tidy -
使用
go mod download:
仅下载依赖项到本地缓存,不修改go.mod或go.sum。go mod download -
使用
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 来确保依赖项已下载并同步。

