go module

目录

go help modgo help modulesgo help module-get

go mod init go.xiaosongfu.com/link

go build

go get -u

go mod tidy

常用的 go mod 命令

把常用的 go mod 命令罗列一下:

  • go mod init: 初始化 modules
  • go mod download: 下载所需要的依赖,但是依赖并不是下载到 $GOPATH中,而是 $GOPATH/pkg/mod中,多个项目可以共享缓存的 module。
  • go mod edit: 编辑 go.mod 文件,选项有 - json、-require 和 - exclude,可以使用帮助 go help mod edit
  • go mod graph: 以文本模式打印模块需求图
  • go mod tidy: 删除错误或者不使用的 modules
  • go mod vendor: 生成 vendor 目录,并将 modules 下载到 vendor 中
  • go mod verify: 验证依赖是否正确
  • go mod why:查找依赖
  1. 翻墙 在国内访问 golang.org/x的各个包都需要翻墙,你可以在 go.mod中使用 replace 替换成 github 上对应的库。
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
 )

依赖库中的 replace 对你的主 go.mod 不起作用,比如 github.com/smallnest/rpcx的 go.mod 已经增加了 replace, 但是你的 go.mod 虽然 require 了 rpcx 的库,但是没有设置 replace 的话, go get 还是会访问 golang.org/x。

所以如果想编译那个项目,就在哪个项目中增加 replace。

  1. 版本格式 下面的版本都是合法的: gopkg . in / tomb . v1 v1 . 0.0 - 20141024135613 - dd632973f1e7 gopkg . in / vmihailenco / msgpack . v2 v2 . 9.1 gopkg . in / yaml . v2 <= v2 . 2.1 github . com / tatsushid / go - fastping v0 . 0.0 - 20160109021039 - d7bb493dee3e latest

go mod 与 go get

go get这个命令大家应该不会陌生,这是下载go依赖包的根据,Go 1.11 出来了,go get 命令也与时俱进,支持了 modules。 go get 来更新 module:

  • 运行 go get -u 将会升级到最新的次要版本或者修订版本
  • 运行 go get -u=patch 将会升级到最新的修订版本(比如说,将会升级到 1.0.1 版本,但不会升级到 1.1.0 版本)
  • 运行 go get package@version将会升级到指定的版本号

运行go get如果有版本的更改,那么go.mod文件也会更改。

Vendor 机制 默认情况下,Go modules 会忽略 vendor/ 目录。这个想法是最终废除掉 vendor 机制。但如果我们仍然想要在我们的版本管理中添加 vendor 机制管理依赖,我们还是可以这么做的:

$ go mod vendor

这会在你项目的根目录创建一个 vendor/目录,并包含你的项目的所有依赖项。

即使如此,go build 默认还是会忽略这个目录的内容,如果你想要构建的时候从 vendor/ 目录中获取依赖的代码来构建,那么你需要明确的指示:

$ go build -mod vendor

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

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