GOPATH的改动以及 go get/install 区别 | 豆包MarsCode AI刷题

145 阅读4分钟

GOPATH前后两个版本

以前

GOPATH 是 Go 语言的一个重要环境变量,用于指定 Go 的工作区(Workspace)。

在 Go 的早期版本中,GOPATH 是 Go 项目管理的核心概念,用于存储 Go 源代码、依赖包和编译生成的文件等。

虽然 Go Modules 引入后 GOPATH 的重要性有所下降,但它在 Go 开发环境中仍然扮演着一些关键角色。

GOPATH 的作用

  1. 存放源码、依赖包和可执行文件

    • GOPATH目录结构通常包含以下三个子目录:

      • src:存放源代码。每个 Go 包都有一个目录结构,路径对应导入路径(import path),如 GOPATH/src/github.com/user/project。这是以前的有的,但是现在go mod出现后,就没有这个src的目录了
      • pkg:存放编译后的包文件。Go 编译后会将依赖包的二进制文件存放在这里,以加快编译速度。
      • bin:存放编译生成的可执行文件。如果你的 Go 包包含 main 函数并被编译为可执行文件,会放在这里。

    例如,如果 GOPATH 设置为 /Users/username/go,则:

    • Go 源代码会放在 /Users/username/go/src 下。
    • 编译后的依赖包文件会存放在 /Users/username/go/pkg 下。
    • 编译生成的可执行文件会放在 /Users/username/go/bin 下。
  2. 默认的模块缓存位置

    • 在 Go Modules 模式中,GOPATH 中的 pkg/mod 目录被用于存储模块缓存(下载的依赖包)。也就是说,GOPATH 在 Go Modules 模式下主要用作模块缓存的位置,而不再是工作区。
    • 通过 GOPATH/pkg/mod 缓存依赖包,Go 可以更高效地管理模块的下载、缓存和版本控制。
  3. 安装工具的位置

    • 通过 go install 安装的命令行工具会放在 GOPATH/bin 下。例如,安装 godoc 工具后,godoc 可执行文件会被放在 GOPATH/bin 目录中。
    • 如果将 GOPATH/bin 添加到 PATH 环境变量中,安装的 Go 工具就可以在任意位置直接调用。

以前使用GOPATH进行管理的文件结构:src放所有的.gogo get后的包也放在这里;pkg用来存放这些中间产物,比如,gin包的编译后的东西,用来加速项目的编译;bin放所有的.exe文件,包括工具、项目编译后的可执行文件

但是这样就导致了一个问题,就是因为src放所有的第三方依赖,那么我两个项目,用一个包的不同版本怎么办?没办法!

现在

现在:GOPATH下,有binpkgpkg中有modsumdbmod中有go get安装的依赖包以及cache

现在的bin中只放可执行的工具,没有项目的.exe

现在也没有src文件了

image-20241129002835305.png

总结一下

image-20241129003207249.png

go get/install 区别

一句话:对于现在的golang来说,官方指定了go get用来三方依赖的下载,go install用来下载.exe可执行文件

在 Go 语言中,go getgo install 是两个常用的命令,用于管理和安装 Go 包。它们在使用目的和行为上有所不同,特别是在 Go 1.17 及之后版本中有了一些重要变化。

1. go get

  • 主要用途: 用于获取远程代码依赖并将其添加到当前模块的依赖列表中。

  • 行为

    • 下载指定的包及其依赖。
    • 将下载的包版本记录到 go.mod 文件中。
    • 不会默认安装二进制文件(Go 1.17+ 的行为)。
  • 适用场景

    • 更新项目的依赖项或引入新依赖。
    • 在模块化项目中(带有 go.mod 文件)更常用。

示例:

 go get example.com/some/package
  • example.com/some/package 包下载并记录到 go.mod 文件中。
  • Go 1.17 开始,go get 的作用被限制在管理依赖,而不是安装二进制文件。如果需要安装工具,可以用 go install

2. go install

  • 主要用途: 用于安装指定版本的 Go 包或编译为二进制文件。

  • 行为

    • 编译并安装指定的 Go 包。
    • 如果是 Go 1.17 及之后的版本,推荐用于安装指定版本的命令行工具。
    • 不会影响 go.mod 文件。
  • 适用场景

    • 安装命令行工具或生成本地二进制文件。

示例:

 go install example.com/some/tool@latest
  • 安装 example.com/some/tool 的最新版本到 $GOPATH/bin 路径下。
  • 如果不指定版本号(如 @latest),需要在 Go 1.17 及之后的版本中运行 go install 时明确指向主模块之外的路径,否则会报错。
  • 二进制文件默认安装到 GOBIN 环境变量指定的路径中,通常是 $GOPATH/bin