开发中,我们往往需要引用第三方库,在 Java 中,使用 Maven 来管理依赖,在 Node 中,使用 npm 来管理依赖。但在 Go 早期(v1.11之前)的版本中,依赖管理是缺失的功能,知道 v1.11 版本开始,才引入了 Modules,作为官方的依赖管理。
我们以一个简单的例子来说明如何使用 go modules 来管理依赖,该案例使用 Go v1.14 版本, 开发环境为 Windows 10。
构建项目
首先我们构建一个空项目,这在 Go 的项目开发中非常简单,建立一个空目录即可, 执行:
1 | mkdir myserver |
注意,在本实验中不要将目录建在 GOPATH 中, 进入到 myserver 目录中,初始化 go modules, 执行:
1 | go mod init |
系统将返回如下信息
1 | go: cannot determine module path for source directory D:\myserver (outside GOPATH, module path must be specified) |
因为 myserver 这个目录不在 GOPATH 中,没关系,因为我们就是不想用 GOPATH 来管理依赖。
指定一个模块名,执行:
1 | go mod init hohistar.com.cn/learn/go/modules/start/v1 |
系统反馈:
1 | go: creating new go.mod: module hohistar.com.cn/learn/go/modules/start/v1 |
说明已经初始化成功,并且在目录中生成了一个名为: go.mod 的文件 (如果你用过 node, 这个文件类似于 package.json, 或者你熟悉 Java, 那就相当于 pom.xml 文件)
打开 go.mod 文件,可以看到如下的内容:
1 | module hohistar.com.cn/learn/go/modules/start/v1 |
可以看到,文件中声明了本模块的名称(在 go mod init 中指定的)和项目中 Go 的版本
引用第三方模块
在通常情况下,你可以直接在程序中 import 第三方模块, Go 的构建系统会在构建时自动下载相关的依赖。在这里我们使用这种方法,我们引用流行的Web框架: Gin。
新建一个名为: server.go 的文件,代码我们直接使用 Gin 中的入门案例:
1 | package main |
保存以后,直接在命令行运行:
1 | go run server.go |
可以看到系统反馈:
1 | go: finding module for package github.com/gin-gonic/gin |
注意第1,2行,构建系统已经发新了需要的依赖并建其下载
这个时候我们也会注意到,在项目目录 (myserver) 中,自动生成了一个新的文件: go.sum, 打开文件可以看到:
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
项目中依赖的库,依赖库的依赖库(多层依赖)的声明都在该文件中。
那这些库下载后保存到那里的呢? 显然不在项目目录中:)
打开 GOPATH 路径,你会发现以上的依赖库全部被下载到 GOPATH 的 pkg/mod 子目录中的。这种组织和运作方式和 Java (Maven) 中的非常相似。