官方文档

modules的wiki: https://github.com/golang/go/wiki/Modules

go 1.14

模块支持已经准备好用于生产,并且鼓励所有用户从其他依赖管理系统迁移到模块。

go 1.16

模块模式默认开启,即GO111MODULE=on。

GO111MODULE

GO111MODULE有三个值:off、on和auto,不同版本的默认值不尽相同。

  1. off:go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本通过vendor目录或者GOPATH模式查找。
  2. on:go命令行会使用modules,而且一点也不会去GOPATH目录下查找。
  3. auto:go命令行将会根据当前目录来决定是否启用module功能,分为两种情形:
    1. 当前目录在$GOPATH/src之外且该目录包含go.mod文件
    2. 当前文件在包含go.mod文件的目录下面

说明:当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。

基本命令

golang提供了go mod命令来管理包,后置参数如下

命令 说明
download 下载依赖包
edit 编辑go.mod
graph 打印模块依赖图
init 在当前目录初始化mod
tidy 拉取缺少的模块,移除不用的模块
vendor 将依赖复制到vendor下
verify 验证依赖是否正确
why 解释为什么需要依赖

mod文件

go.mod文件中提供了四个命令:

命令 说明
module 指定包的名称
require 指定依赖项模块
replace 替换依赖项模块
exclude 忽略依赖项模块

项目案例

环境:go 1.16.3

创建项目

1
2
3
4
5
$ mkdir go-mod && cd go-mod
$ go mod init hello
$ touch server.go
$ mkdir api && cd api
$ touch hello.go && touch print.go

项目结构

1
2
3
4
5
6
go-mod
├── go.mod
├── server.go
└── api
├── hello.mod
└── print.go

其中server需要调用api中的hello的_HelloKHighness_和print的_ConsolePrint_接口。

初始化的go-mod中内容如下:

1
2
3
module hello

go 1.16

hello.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package api

/**
* @author KHighness
* @since 2021-04-20
*/

import (
"github.com/labstack/echo"
"net/http"
)

func HelloKHighness(c echo.Context) error {
return c.JSON(http.StatusOK, "Hello KHighness!")
}

print.go

1
2
3
4
5
6
7
8
9
10
11
12
package api

/**
* @author KHighness
* @since 2021-04-20
*/

import "fmt"

func ConsolePrint() {
fmt.Println("Hello, KHighness!")
}

server.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

/**
* @author KHighness
* @since 2021-04-20
*/

import (
"github.com/labstack/echo"
helloAPI "hello/api"
)

func main() {
helloAPI.ConsolePrint()
e := echo.New()
e.GET("/", helloAPI.HelloKHighness)
e.Logger.Fatal(e.Start(":3333"))
}

安装依赖

1
2
3
4
5
6
7
8
9
10
11
$ go mod tidy
go: finding module for package github.com/labstack/echo
go: found github.com/labstack/echo in github.com/labstack/echo v3.3.10+incompatible
go: finding module for package github.com/stretchr/testify/assert
go: finding module for package github.com/labstack/gommon/color
go: finding module for package github.com/labstack/gommon/log
go: finding module for package golang.org/x/crypto/acme/autocert
go: found github.com/labstack/gommon/color in github.com/labstack/gommon v0.3.0
go: found github.com/labstack/gommon/log in github.com/labstack/gommon v0.3.0
go: found golang.org/x/crypto/acme/autocert in golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc
go: found github.com/stretchr/testify/assert in github.com/stretchr/testify v1.7.0

安装后可以看到go.mod文件如下:

1
2
3
4
5
6
7
8
9
10
module hello

go 1.16

require (
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc // indirect
)

运行项目

1
2
3
4
5
6
7
8
9
10
11
12
$ go run server.go
Hello, KHighness!

____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:3333

项目测试

1
2
 $ curl -X GET http://127.0.0.1:3333
"Hello KHighness!"

项目打包

1
$ go build

打包后在项目根目录下可以看到hello.exe可执行文件。

参考链接

[1] modules wiki: https://github.com/golang/go/wiki/Modules
[2] go mod 使用: https://juejin.cn/post/6844903798658301960
[3] 再探go modules: https://www.cnblogs.com/apocelipes/p/10295096.html