golang 1.11 开始新加入mod特性

mod用来替换旧版本基于GOPATH来指定构建项目的方式。

使用介绍

  1. golang版本需要1.11或以上版本
  2. 设置GO111MODULE参数
  • GO111MODULE=off: 关闭mod模式使用GOPATH方式
  • GO111MODULE=on: 使用mod模式不使用GOPATH方式,不去GOPATH路径查找
  • GO111MODULE=auto: 默认值,根据当前目录是否存在go.mod文件来判断,如果go.mod文件中没有包含会去GOPATH路径查找

go mod

使用帮助详解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜  > go mod help
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

        go mod <command> [arguments]

The commands are:

        download    download modules to local cache
        edit        edit go.mod from tools or scripts
        graph       print module requirement graph
        init        initialize new module in current directory
        tidy        add missing and remove unused modules
        vendor      make vendored copy of dependencies
        verify      verify dependencies have expected content
        why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

使用语法

go mod <command> [arguments]
  • 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 (解释为什么需要依赖)

使用go rungo build后项目目录下会存在两个文件:

  • go.mod 是描述直接依赖包
  • go.sum 是描述依赖树锁定

go.mod 提供了module, requirereplaceexclude 四个命令

  • module 语句指定包的名字(路径)
  • require 语句指定的依赖项模块
  • replace 语句可以替换依赖项模块
  • exclude 语句可以忽略依赖项模块

go get

go get命令可以指定版本或tag升级依赖,并会自动更新go.mod文件

tag必须是语义化的、带v前缀的版本号

使用示例:

1
2
3
4
5
6
go get github.com/gorilla/mux           # 匹配最新的一个 tag
go get github.com/gorilla/mux@latest    # 和上面一样
go get github.com/gorilla/mux@v1.6.2    # 匹配 v1.6.2
go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2
go get github.com/gorilla/mux@c856192   # 匹配 c85619274f5d
go get github.com/gorilla/mux@master    # 匹配 master 分支

go get 升级

  • 运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)

  • 运行 go get -u=patch 将会升级到最新的修订版本

  • 运行 go get package@version 将会升级到指定的版本号version

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

  • 使用命令 go list -m -u all 来检查可以升级的package,

  • 使用go get -u need-upgrade-package 升级后会将新的依赖版本更新到go.mod

  • 使用 go get -u 升级所有依赖

go build

  • go build -mod=readonly 防止隐式修改 go.mod,如果遇到有隐式修改的情况会报错,可以用来测试 go.mod 中的依赖是否整洁,但如果明确调用了 go mod、go get 命令则依然会导致 go.mod 文件被修改。

  • go build -mod=vendor 在开启模块支持的情况下,用这个可以退回到使用 vendor 的时代。

goproxy

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

# 设置不走 proxy 的私有仓库,多个用逗号相隔(可选)
go env -w GOPRIVATE=*.corp.example.com

# 设置不走 proxy 的私有组织(可选)
go env -w GOPRIVATE=example.com/org_name

参考