简单说 Go Modules 就是包管理,从 go1.11 开始支持,可以不需要gopath存在,环境变量GO111MODULE
,默认为 auto
项目存在 go.mod
则使用 go module ,否则使用GOPATH 和 vendor 机制。
这个解决的问题是:你引用的代码包上游变更不会直接影响你的项目,这显然是开始关心“包版本”了。遗憾的是依旧没有解决包管理的问题,比如不同的包依赖了同一个包的不同版本怎么办?版本间代码冲突怎么办?vendor 机制并没有解决,于是围绕 vendor/ 社区就出了几十个包管理工具,一时间百花齐放、百家争鸣、各有所长,导致 golang 的包管理生态变得有些混乱。
初始化
对于新建项目使用 go module
:
1
2
3
4
5
6
$ export GO111MODULE=on
$ go mod init github.com/you/hello
// go build 会将项目的依赖添加到 go.mod 中
$ go build
对于已有项目要改为使用 go module:
1
2
3
4
5
6
7
$ export GO111MODULE=on
// 创建一个空的 go.mod 文件
$ go mod init .
// 查找依赖并记录在 go.mod 文件中
$ go get ./...
go.mod
文件必须要提交到 git 仓库,但 go.sum
文件可以不用提交到 git 仓库(git 忽略文件 .gitignore 中设置一下)。
项目的打包
首先需要使用 go mod vendor
将项目所有的依赖下载到本地 vendor 目录中然后进行编译,下面是一个参考:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
export GO111MODULE="on"
export GOPROXY="https://goproxy.io"
export CGO_ENABLED="0"
export GOOS="linux"
export GOARCH=amd64
go mod vendor
go build -ldflags "-s -w" -a -installsuffix cgo -o audit-webhook .
对于墙外的库
在go.mod中可以使用 replace
将特定的库替换成其他库:
1
2
3
replace (
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
也可以使用阿里云的镜像站:
1
$ export GOPROXY="https://mirrors.aliyun.com/goproxy/"
或
1
$ export GOPROXY="https://goproxy.cn,direct"
什么情况下使用
一般是发布的开源程序,或私有源上使用这种方式管理依赖包。
go mod 命令一览
使用方式不习惯就不用,萝卜白菜,各有所爱。
本文网址: https://golangnote.com/topic/268.html 转摘请注明来源