【Go】go get & go mod

go get

go get 命令用于从远程代码仓库(如 GitHub 或 GitLab)下载 Go 语言的包及其依赖,并将其安装到本地的 Go 开发环境中。从 2019 年开始,随着 Go Modules 功能的普及和默认启用,go get 的行为有所变化:

  1. 对于使用 Go Modules 的项目(Go 1.11 版本以后),当你执行 go get 命令时,它会根据 go.mod 文件管理依赖,并将依赖包下载至 $GOPATH/pkg/mod 目录下(如果设置了 GOPATH)。同时,go get 也会在全局模块缓存中存储依赖,通常位于 ~/.cache/go-build(对于 Unix 系统)或 %USERPROFILE%\.cache\go-build(对于 Windows 系统)。

  2. 如果你是在一个非模块化的项目(或者禁用了模块功能)并且设置了 GOPATH,那么下载的源码将会存储在 GOPATH/src 目录下相应的位置,例如:

    GOPATH=/home/user/go
    

    执行 go get github.com/user/repo 后,源码会被放在:

    /home/user/go/src/github.com/user/repo
    
  3. 对于可执行程序(比如 main 包),如果使用 Go Modules,它们会被安装到一个与项目相关的临时目录(由 Go Modules 管理),而不再是传统的 GOPATH/bin。若想将可执行文件安装到某个特定目录,可以使用 go install 命令配合 -i 标志(现在 -i 不再需要,因为 go install 默认包含了构建和安装的动作)和 -o 标志指定输出路径。

  4. 如果需要查看已安装到可执行路径下的二进制文件,可以通过 go list -f '{{.Target}}' <package> 查看对应包编译后的二进制文件路径。

  5. 在 Go 1.13 版本后,为了更细粒度地控制依赖,推荐使用 go install 命令替代 go get 来安装独立的命令行工具或库。

总之,go get 下载的包位置与项目的 Go Modules 设置和全局 GOPATH 设置紧密相关。随着 Go 语言的发展,最佳实践也在不断演进,因此建议始终查阅最新的官方文档了解最新行为。

go mod

Go Mod 是 Go 语言从 1.11 版本开始引入的模块化依赖管理工具。它为大型项目、跨多个仓库的工作以及更好地处理外部依赖提供了支持。主要特性包括:

  1. 模块定义:每个 Go 项目都可以有一个名为 go.mod 的文件,其中定义了模块的基本信息,如模块名称(通常是项目根目录下的相对路径或VCS仓库URL)和所需的最低Go版本。
module github.com/username/repo

go 1.16
  1. 依赖管理:当通过 go buildgo testgo rungo get 运行时,Go 会自动处理并记录项目依赖在 go.mod 文件中。添加依赖时,Go 会找到合适的版本(遵循语义化版本控制 SemVer 规范),并确保所有依赖之间的兼容性。

  2. 代理服务:Go 支持使用代理服务器(如 https://proxy.golang.org/)来加速依赖下载,并提供镜像和验证功能。

  3. 版本锁定go.sum 文件记录了依赖包的确切哈希值,确保每次构建时使用的都是相同的代码。

  4. 版本选择策略:Go 有灵活的版本选择策略,可以通过 require 语句在 go.mod 文件中明确指定依赖包的具体版本,也可以通过 go get -u 更新依赖到最新可用的版本(符合语义化版本规则)。

  5. 私有依赖支持:Go Mod 支持使用环境变量 GOPRIVATE 或 go.mod 中 replace 语句等方式解决私有仓库的依赖问题。

  6. 工作区模式:Go 1.13 版本之后引入了工作区模式,可以在同一工作区下管理多个模块项目,便于大型项目拆分和多模块协同开发。

使用 Go Mod 后,开发者无需设置 GOPATH,只需在项目根目录下运行 Go 命令即可。这极大地简化了大型 Go 项目的管理和维护流程。

posted @ 2024-04-12 11:38  小白一生  阅读(22)  评论(0编辑  收藏  举报