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 才能正常工作。
- 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