起因是,遇到一个问题:
经查阅资料,很可能跟包管理有关,之前有了解过忘了就再学一遍顺便解决问题。
学习资料:
- GO111MODULE 是个啥? - 知乎 (zhihu.com)
- go mod使用 - 简书 (jianshu.com)
所谓包管理,比如软件包管理,方便进行软件安装,升级,卸载等一些操作;
Go语言程序中经常会引入其他的package来使用;
Go语言刚开始是并没有包管理相关功能,实现import
时:
- 我理解是:早期需要啥包,就手动go get什么。
go get
命令:会根据路径,把相应的模块获取并保存在$GOPATH/src
。
Go Modules
Go 1.11 引入Go Modules
后:
GO111MODULE = off
:强制使用GOPATH 方式;GO111MODULE = on
:强制使用Go Modules
;GO111MODULE = auto
:
- 当存在 go.mod 文件时或处于 GOPATH 外, 相当于 GO111MODULE=on。
- 相当于 Go 1.13 下你可以将所有的代码仓库均不存储在 GOPATH 下。
- 当项目目录处于 $GOPATH 内,且没有 go.mod 文件存在时,相当于 GO111MODULE=off。
- 使用
Go Modules
时,在go build
期间使用的包存储在$GOPATH/pkg/mod
中(而不是GOPATH的$GOPATH/src
中)。 - 执行
go run xxx.go
运行代码会发现go mod
会自动查找依赖自动下载。
到这以后,会考虑到go.mod
这个从哪里来,是自己手动创建么?接着学习go mod
;
go mod命令
Go mod
命令是实现Go Modules
的工具;就相当于go get
和GOPATH
的关系;
go mod
命令参数:
图片来源:go mod使用 - 简书 (jianshu.com);常用的是
init
,tidy
,edit
初始化一个项目;
go mod init xxx
xxx与package名字无关;只是给当前项目用的模块(modules)一个名字;
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
同时还生成了
go.sum
其中包含软件包的哈希值,以确保我们具有正确的版本和文件。
go.mod
提供了module, require、replace和exclude 四个go.mod内的关键字:
module
语句指定包的名字(路径)require
语句指定的依赖项模块replace
语句可以替换依赖项模块exclude
语句可以忽略依赖项模块
解决问题
1 确认GO111MODULE=on
:确认了无数次,不仅zsh里配置了,bash里面也配置了;
但用go list
是,依旧出现了如下报错,配置的GO111MOUDLE=on
未生效。
go env -w GO111MODULE=on
这样之后就好了。
所以我就有一个疑问了,为什么bash配置文件中添加的GO111MODULE=on
没生效?
macos,我只用zsh,zshrc中添加了,也source了;甚至bash_profile,profile也都添加了;为什么go env中还需要再设置一遍?很奇怪!