GO111MODULE 是个啥?

简介: 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
相关文章
|
存储 缓存 Linux
Go Modules 介绍与基本操作(上)
Go Modules 介绍与基本操作
95 0
|
缓存 编译器 Go
Golang 语言 vendor 在 GOPATH 和 Modules 中的区别
Golang 语言 vendor 在 GOPATH 和 Modules 中的区别
62 0
|
1月前
|
存储 缓存 算法
go vendor module
go vendor module
|
存储 Go API
怎么发布 Go Modules v1 版本?
怎么发布 Go Modules v1 版本?
61 0
go: finding module for package
go: finding module for package
105 0
|
Go API
Go Modules 介绍与基本操作(下)
Go Modules 介绍与基本操作(下)
72 0
|
存储 缓存 Go
为什么应该使用 Go module proxy
为什么应该使用 Go module proxy
157 0
|
缓存 IDE Go
记一次go module的坑
事情是这样的,因为小马本次要写一个go项目。但是因为一些权限问题,一些依赖包在内网小马获取不到,于是只能求助大大。大大给的策略就是他先把所有的依赖包go mod,然后go mod vendor迁移到项目目录vendor下进行本地依赖载入即可,也就是使用 go build -mod=vendor来编译即可。一切似乎看起来还是那么完美。然后正要起飞,直接翻车,现场如下。【这里插播一条发现,就是使用golang IDE go build 和使用命令行go build 的区别在于前者不会生成.exe文件】
422 0
记一次go module的坑
go module的使用:
go module的使用:
127 0
|
Kubernetes Go 数据安全/隐私保护
两个生僻小命令---go mod why和go mod graph
两个生僻小命令---go mod why和go mod graph
578 0