使用 Go 模块
介绍
这篇文章是系列的第 1 部分。
- 第 1 部分 — 使用 Go 模块(这篇文章)
- 第 2 部分 — 迁移 To Go 模块
- 第 3 部分 — 发布 Go 模块
- 第 4 部分 — Go 模块:v2 及更高版本
- 第 5 部分 — 保持模块兼容
注意: 有关使用模块管理依赖项的文档,请参阅管理依赖项。
Go 1.11 和 1.12 包括对模块的初步支持, Go 的新依赖管理系统,使依赖版本信息明确 并且更易于管理。 这篇博文介绍了所需的基本操作 以开始使用模块。
模块是存储在文件树中的 Go 包的集合,其根目录为文件。 该文件定义了模块的模块路径, 这也是用于根目录的导入路径, 及其依赖性要求, 哪些是成功构建所需的其他模块。 每个依赖项要求都是 编写为模块路径和特定语义版本。go.mod``go.mod
从 Go 1.11 开始,go 命令允许使用模块 当当前目录或任何父目录具有 , 前提是目录在 . (在里面,为了兼容,go 命令 仍然在旧的 GOPATH 模式下运行,即使找到 。 有关详细信息,请参阅 go 命令文档。 从 Go 1.13 开始,模块模式将是所有开发的默认设置。go.mod``$GOPATH/src``$GOPATH/src``go.mod
这篇文章介绍了一系列常见操作 使用模块开发 Go 代码时出现的情况:
- 创建新模块。
- 添加依赖项。
- 升级依赖项。
- 添加对新主要版本的依赖关系。
- 将依赖项升级到新的主要版本。
- 删除未使用的依赖项。
创建新模块
让我们创建一个新模块。
在 外部的某个位置创建一个新的空目录,然后创建一个新的源文件:$GOPATH/src``cd``hello.go
package hello
func Hello() string {
return "Hello, world."
}
让我们也写一个测试,在:hello_test.go
package hello
import "testing"
func TestHello(t *testing.T) {
want := "Hello, world."
if got := Hello(); got != want {
t.Errorf("Hello() = %q, want %q", got, want)
}
}
此时,目录包含一个包,但不包含一个模块, 因为没有文件。 如果我们现在在工作并运行, 我们会看到:go.mod``/home/gopher/hello``go test
$ go test
PASS
ok _/home/gopher/hello 0.020s
$
最后一行总结了整个包测试。 因为我们在任何模块之外工作, 该命令不知道 的导入路径 当前目录并组成一个假目录 在目录名称上:。$GOPATH``go``_/home/gopher/hello
让我们将当前目录设置为模块的根目录 通过使用,然后重试:go mod init``go test
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
$ go test
PASS
ok example.com/hello 0.020s
$
祝贺!您已经编写并测试了您的第一个模块。
该命令写入了一个文件:go mod init``go.mod
$ cat go.mod
module example.com/hello
go 1.12
$
该文件仅显示在模块的根目录中。 子目录中的包具有包含以下内容的导入路径: 模块路径加上子目录的路径。 例如,如果我们创建了一个子目录, 我们不需要(也不想)跑到那里。 包将自动识别为模块的一部分,导入路径为 。go.mod``world``go mod init``example.com/hello``example.com/hello/world