GO111MODULE 是个啥?

GO111MODULE 是啥?

GO111MODULE 是个环境变量,可以在使用 Go 或者更改 Go 导入包的方式时候设置。

要注意的是,这个变量在不同 Go 版本有不同的语义

没有包管理阶段

  • 一开始go发布的时候是没有包管理的
  • go get命令会根据路径,把相应的模块获取并保存在$GOPATH/src
  • 也没有版本的概念,master 就代表稳定的版本

首先,让我们谈谈 GOPATH。当 Go 在 2009 年首次推出时,它并没有随包管理器一起提供。取而代之的是 go get,通过使用它们的导入路径来获取所有源并将其存储在 $GOPATH/src 中。没有版本控制并且『master』分支表示该软件包的稳定版本。

Go 1.11 引入了 Go 模块。 Go Modules 不使用 GOPATH 存储每个软件包的单个 git checkout,而是存储带有 go.mod 标记版本的标记版本,并跟踪每个软件包的版本。

什么时候用 GOPATH, 什么时候用 GOMODULE ? 这是个问题,需要通过 GO111MODULE 来解决。

Go 1.11 和 1.12 阶段

即使项目在您的 GOPATH 中,GO111MODULE = on 仍将强制使用 Go 模块。仍然需要 go.mod 才能正常工作。
  1. GO111MODULE = off
强制 Go 表现出 GOPATH 方式,即使你的项目不在 GOPATH 目录里。

. GO111MODULE = auto 是默认模式。

在这种模式下,Go 会表现: 当项目路径在 GOPATH 目录外部时, 设置为 GO111MODULE = on 当项目路径位于 GOPATH 内部时,即使存在 go.mod, 设置为 GO111MODULE = off。

Go 1.13 阶段

在 Go 1.13 下, GO111MODULE 的默认行为 (auto) 语义变了。

  • 当存在 go.mod 文件时或处于 GOPATH 外, 其行为均会等同于 GO111MODULE=on。相当于 Go 1.13 下你可以将所有的代码仓库均不存储在 GOPATH 下。
  • 当项目目录处于 GOPATH 内,且没有 go.mod 文件存在时其行为会等同于 GO111MODULE=off。

Go Modules 的使用说明

使用 go get 同样会更新你的 go.mod

go get 通常它是用于提供一个安装或下载包的功能。但如果使用了 Go modules,当你在一个有着 go.mod 文件存在的仓库下使用这个命令会将你所下载或安装的包静默记录于 go.mod 文件中。

Go Modules 依赖项的存储在哪个目录?

使用 Go Modules 时,在 go build 期间使用的包存储在 $GOPATH/pkg/mod 中。

在尝试在开发工具中的import时,你可能最终使用的包是 GOPATH 中的版本,而不是编译期间使用的 pkg/mod

当让项目固定指向一个依赖项时,可以使用 vendor 目录

  • 解决方法 1: 使用 go mod vendor + go build -mod=vendor。这将强制 go 使用 vendor/files 而不是 $GOPATH/pkg/mod 中的一个。该选项还解决了 开发工具 不能打开包文件的正确版本的问题。
  • 解决方法 2: 在 go.mod 末尾添加 replace 行:
use replace github.com/maelvls/beers => ../beers

欢迎关注:程序员开发者社区

参考资料

发布于 2021-05-22 14:26