简单说 Go Modules 就是包管理,从 go1.11 开始支持,可以不需要gopath存在,环境变量GO111MODULE
,默认为 auto
项目存在 go.mod
则使用 go module ,否则使用GOPATH 和 vendor 机制。
这个解决的问题是:你引用的代码包上游变更不会直接影响你的项目,这显然是开始关心“包版本”了。遗憾的是依旧没有解决包管理的问题,比如不同的包依赖了同一个包的不同版本怎么办?版本间代码冲突怎么办?vendor 机制并没有解决,于是围绕 vendor/ 社区就出了几十个包管理工具,一时间百花齐放、百家争鸣、各有所长,导致 golang 的包管理生态变得有些混乱。
初始化
对于新建项目使用 go module
:
Bash: GO111MODULE
1
2
3
4
5
6 |
$ export GO111MODULE=on
$ go mod init github.com/you/hello
// go build 会将项目的依赖添加到 go.mod 中
$ go build
|
对于已有项目要改为使用 go module:
Bash: go mod init
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 目录中然后进行编译,下面是一个参考:
Bash: 项目打包
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
将特定的库替换成其他库:
Go: replace
1
2
3 |
replace (
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
|
也可以使用阿里云的镜像站:
Bash: GOPROXY
1 |
$ export GOPROXY="https://mirrors.aliyun.com/goproxy/"
|
或
Bash: GOPROXY
1 |
$ export GOPROXY="https://goproxy.cn,direct"
|
什么情况下使用
一般是发布的开源程序,或私有源上使用这种方式管理依赖包。
go mod 命令一览

使用方式不习惯就不用,萝卜白菜,各有所爱。
本文网址: https://golangnote.com/topic/268.html 转摘请注明来源
Related articles
Go 很适于网络编程,下面是实现一个简单的 TCP 服务...
google 自家的 snappy 压缩优点是非常高的速度和合理的压缩率。压缩率比 gzip 小,CPU 占用小。...
有两种方法,runtime/pprof 和 net/http/pprof ,后者封装了前者...
groupcache 是 memcached 作者 Brad Fitzpatrick 用 Go 语言编写的缓存及缓存过滤库,作为 memcached 许多场景下的替代版本。...
bolt 是一款高性能的key value 数据库,下面是它的使用示例:...
使用Golang 的底层库 `io` 、 `os` 对文件常规操作:新建、写入、读取、删除。另外内置的 `ioutil` 使用也很方便。...
Golang 内置库net 有一些函数能方便获取DNS 记录信息。...
Go 分片切割大文件...
Blb是一种用go 实现的分布式对象存储系统。 它专为在集群计算环境中的裸机上使用而设计。客户端API 也用Go来实现,它使用类似于Go文件(io.ReadWriteSeeker)的接口公开对象。...
Go 1.5.1版本对编译器,汇编器, fmt, net/textproto, net/http, 和 runtime 包的 bug 修复。...