Go Modules(go mod) + Goland IDE快速上手

Go Module 概述

请自行百度

Go mod 命令解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
go help modules

go mod命令

download download modules to local cache (下载依赖的module到本地cache))
edit edit go.mod from tools or scripts (编辑go.mod文件)
graph print module requirement graph (打印模块依赖图))
init initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))
tidy add missing and remove unused modules (增加丢失的module,去掉未用的module)
vendor make vendored copy of dependencies (将依赖复制到vendor下)
verify verify dependencies have expected content (校验依赖)
why explain why packages or modules are needed (解释为什么需要依赖)

初始化mod

go mod init [module]可以创建一个go.mod,只有一行信息module。

Go Module 快速上手

首先 如果是老项目想使用 Go Modules 确保Goland中你的项目结构如下:

其中包含一个 main.go 主文件

如果创建新项目则在新建时确认如下 (新建时会在项目根目录创建一个 go.mod 文件)

菜单栏 Goland ➡ Preferences… ➡ Go ➡ GOPATH 如下

菜单栏 Goland ➡ Preferences… ➡ Go ➡ Dep 如下

菜单栏 Goland ➡ Preferences… ➡ Go ➡ Go Modules(vgo) 如下

打开 Terminal 进入到项目根目录 执行 go mod init [项目名] ,如下:

image-20190226022457955

此时已经给项目使用了 go modules

接下来执行 go mod tidy

开始等待安装依赖库

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ProxyHunter go mod tidy 
go: finding github.com/issue9/term/colors latest
go: finding github.com/gogf/gf/g/crypto/gmd5 latest
go: finding github.com/gogf/gf/g/os/gfile latest
go: finding github.com/gogf/gf/g/encoding/gjson latest
go: finding github.com/gogf/gf/g/os/grpool latest
go: finding github.com/gogf/gf/g/util/gconv latest
go: finding github.com/gogf/gf/g/text/gstr latest
go: finding github.com/gogf/gf/g/util/grand latest
go: finding github.com/gogf/gf/g/container/gmap latest
go: finding github.com/levigross/grequests latest
go: downloading github.com/levigross/grequests v0.0.0-20190130132859-37c80f76a0da
...

如果速度很慢 ,请看这里:

设环境变量

GOPROXY=https://goproxy.io

GOPROXY=https://athens.azurefd.net

可以让 1.11 引入的 go module 使用这些代理下载

1
2
export GOPROXY="https://athens.azurefd.net" 
export GO111MODULE=on

GO111MODULE 解释, 当为 on 时则使用 Go Modules ,go 会忽略 $GOPATHvendor 文件夹,只根据go.mod下载依赖。当为 off 时则不适用新特性 Go Modules 支持,它会查找 vendor目录和 $GOPATH 来查找依赖关系,也就是继续使用“GOPATH模式”。当为 auto 时或未设置时则根据当前项目目录下是否存在 go.mod文件或 $GOPATH/src 之外并且其本身包含go.mod文件时才会使用新特性 Go Modules模式,并且autoGO111MODULE 的默认值。

科普时间:

go.mod文件可以通过require,replace和exclude语句使用的精确软件包集。

require语句指定的依赖项模块
replace语句可以替换依赖项模块
exclude语句可以忽略依赖项模块

执行 go mod download

可以下载所需要的依赖,但是依赖并不是下载到GOPATH中,而是GOPATH/pkg/mod中,多个项目可以共享缓存的module。

执行 go clean -modcache 清除缓存

go mod 新东西偶尔还会出现问题 ,这个命令可以尝试修复,不过执行之前可以考虑备份一下pkg/mod中的包.以防不测.

在国内访问 golang.org/x 的各个包都需要翻墙,
你可以在go.mod中使用replace替换成github上对应的库。

1
2
3
4
5
replace (
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

go mod 探索中 …