包管理Go module

2019-05-06

使用方法

先将GO mudule置为有效:

1
set GO111MODULE=on

运行:

1
go mod init

会在项目的目录下生成一个go.mod的文件:

1
2
3
go.mod:

module Gin/learnGin/wamsGin

有一行内容,如上所示,其中Gin/learnGin/wamsGin是项目在$GOPATH下的路径。

在运行go命令(‘go build’, ‘go test’, 甚至 ‘go list’)执行时,会自己去修改go.mod文件,执行后go.mod文件新内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module Gin/learnGin/wamsGin

require (
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
github.com/gin-gonic/gin v1.3.0
github.com/go-ini/ini v1.42.0
github.com/go-sql-driver/mysql v1.4.1 // indirect
github.com/golang/protobuf v1.3.1 // indirect
github.com/jinzhu/gorm v1.9.2
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/ugorji/go/codec v0.0.0-20190320090025-2dc34c0b8780 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)

可见,go.mod中记录了依赖包及其版本号。

如果想更好的控制,可以修改 GO111MODULE 临时环境变量。

GO111MODULE的取值为off, on, or auto(默认值,因此前面例子里需要注意2个重点)。

  • off: GOPATH mode,查找vendor和GOPATH目录
  • on:module-aware mode,使用 go module,忽略GOPATH目录
  • auto:如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用GO111MODULE,否则仍旧使用 GOPATH mode。

翻墙

go mod会去源地址下载使用包,某些包在GCE上,是下载不了的,这时候可以使用replace或者代理。

代理goproxy.io

这是一个专门的go语言代理,只需要简单的设置:

1
2
3
4
5
Bash(MAC/Linux):
export GOPROXY=https://goproxy.io

PowerShell(Windows):
$env:GOPROXY = "https://goproxy.io"

replace方式

在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
)

参考:

https://ieevee.com/tech/2018/08/28/go-modules.html