go get
go get
命令用于从远程代码仓库(如 GitHub 或 GitLab)下载 Go 语言的包及其依赖,并将其安装到本地的 Go 开发环境中。从 2019 年开始,随着 Go Modules 功能的普及和默认启用,go get
的行为有所变化:
-
对于使用 Go Modules 的项目(Go 1.11 版本以后),当你执行
go get
命令时,它会根据go.mod
文件管理依赖,并将依赖包下载至$GOPATH/pkg/mod
目录下(如果设置了GOPATH
)。同时,go get
也会在全局模块缓存中存储依赖,通常位于~/.cache/go-build
(对于 Unix 系统)或%USERPROFILE%\.cache\go-build
(对于 Windows 系统)。 -
如果你是在一个非模块化的项目(或者禁用了模块功能)并且设置了
GOPATH
,那么下载的源码将会存储在GOPATH/src
目录下相应的位置,例如:GOPATH=/home/user/go
执行
go get github.com/user/repo
后,源码会被放在:/home/user/go/src/github.com/user/repo
-
对于可执行程序(比如 main 包),如果使用 Go Modules,它们会被安装到一个与项目相关的临时目录(由 Go Modules 管理),而不再是传统的
GOPATH/bin
。若想将可执行文件安装到某个特定目录,可以使用go install
命令配合-i
标志(现在-i
不再需要,因为go install
默认包含了构建和安装的动作)和-o
标志指定输出路径。 -
如果需要查看已安装到可执行路径下的二进制文件,可以通过
go list -f '{{.Target}}' <package>
查看对应包编译后的二进制文件路径。 -
在 Go 1.13 版本后,为了更细粒度地控制依赖,推荐使用
go install
命令替代go get
来安装独立的命令行工具或库。
总之,go get
下载的包位置与项目的 Go Modules 设置和全局 GOPATH 设置紧密相关。随着 Go 语言的发展,最佳实践也在不断演进,因此建议始终查阅最新的官方文档了解最新行为。
go mod
Go Mod 是 Go 语言从 1.11 版本开始引入的模块化依赖管理工具。它为大型项目、跨多个仓库的工作以及更好地处理外部依赖提供了支持。主要特性包括:
- 模块定义:每个 Go 项目都可以有一个名为
go.mod
的文件,其中定义了模块的基本信息,如模块名称(通常是项目根目录下的相对路径或VCS仓库URL)和所需的最低Go版本。
module github.com/username/repo
go 1.16
-
依赖管理:当通过
go build
、go test
、go run
或go get
运行时,Go 会自动处理并记录项目依赖在go.mod
文件中。添加依赖时,Go 会找到合适的版本(遵循语义化版本控制 SemVer 规范),并确保所有依赖之间的兼容性。 -
代理服务:Go 支持使用代理服务器(如 https://proxy.golang.org/)来加速依赖下载,并提供镜像和验证功能。
-
版本锁定:
go.sum
文件记录了依赖包的确切哈希值,确保每次构建时使用的都是相同的代码。 -
版本选择策略:Go 有灵活的版本选择策略,可以通过
require
语句在go.mod
文件中明确指定依赖包的具体版本,也可以通过go get -u
更新依赖到最新可用的版本(符合语义化版本规则)。 -
私有依赖支持:Go Mod 支持使用环境变量 GOPRIVATE 或 go.mod 中 replace 语句等方式解决私有仓库的依赖问题。
-
工作区模式:Go 1.13 版本之后引入了工作区模式,可以在同一工作区下管理多个模块项目,便于大型项目拆分和多模块协同开发。
使用 Go Mod 后,开发者无需设置 GOPATH,只需在项目根目录下运行 Go 命令即可。这极大地简化了大型 Go 项目的管理和维护流程。
标签:GOPATH,依赖,get,Go,go,mod From: https://www.cnblogs.com/liudianer/p/18130849