Skip to content

Latest commit

 

History

History
234 lines (159 loc) · 7.21 KB

5.Getting-started-with-multi-module-workspaces.md

File metadata and controls

234 lines (159 loc) · 7.21 KB

随着 go 1.18 的发布,大家好像更多的关注泛型,但是 workspace 也是非常重要的一个特性,下面是对官方文档的翻译。

本教程介绍 Go 中多模块工作区(workspace)的基础知识。使用多模块工作区,你可以告诉 Go 命令你正同时在多个模块中编写代码,并轻松地在这些模块中构建和运行代码。

在本教程中,你将在共享的多模块工作区中创建两个模块,对这些模块进行更改,并在构建中查看这些更改的结果。

注意:其他详细教程,请参阅此教程

本教程需要 go 1.18 或更高版本。请确保使用 go.dev/dl 链接在本地安装好了 Go 1.18 或更高版本。

先决条件

  • Go 1.18 或更高版本的安装。
  • 用于编辑代码的工具。任何文本编辑器都可以。
  • 一个命令终端。Go 在 Linux 和 Mac 上的任何终端以及 Windows 中的 PowerShell 或 cmd 上都能很好地工作。

创建一个模块(module)

首先,为您要编写的代码创建一个模块。

1.打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

$ cd

在 Windows 上使用 C:\> cd %HOMEPATH%

本教程的其余部分将显示 $ 作为命令行提示。这些命令也可以在 Windows 上运行。

2.在命令提示符下,为您的代码创建一个名为工作区的目录。

$ mkdir workspace
$ cd workspace

3.初始化模块

我们的示例将创建一个 hello 依赖于 golang.org/x/example 模块(module)的新模块。

创建 hello 模块(module):

$ mkdir hello
$ cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello

使用 go get 添加 golang.org/x/example 模块的依赖。

$ go get golang.org/x/example

在 hello 目录下创建 hello.go,内容如下:

package main

import (
    "fmt"

    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.Reverse("Hello"))
}

现在,运行 hello 程序:

$ go run example.com/hello
olleH

创建工作区(workspace)

在这一步中,我们将创建一个 go.work 文件来指定模块的工作区。

初始化 workspace

在 workspace 目录中,运行:

$ go work init ./hello

go work init 命令表示让 go 为包含“./hello 目录下的模块”的工作空间创建 go.work 文件。

这个 go 命令生成一个 go.work,内容如下所示:

go 1.18

use ./hello

这个 go.work 文件的语法与 go.mod 类似

首先,第一行 go 指令告诉 Go 应该使用哪个版本的 Go 来解释文件。它类似于 go.mod 文件中的 go 指令。

use 指令告诉 Go 在进行构建时应把 hello 目录中的模块作为主模块。

所以 ,在 workspace 模块的所有子目录中都会被激活。

运行 workspace 下的程序

在 workspace 目录中,运行:

$ go run example.com/hello
olleH

Go 命令包含工作区中的所有模块作为主模块。这允许我们在模块之外也能引用一个包。在模块或工作区之外运行 go run 命令会导致错误,因为该 go 命令不知道要使用哪些模块。

接下来,我们将 golang.org/x/example 模块的本地副本添加到工作区。然后,我们将向 stringutil 包中添加一个新函数,用它来代替 Reverse

下载并修改 golang.org/x/example 模块

在这一步中,我们将下载包含该模块的 Git 仓库的副本 golang.org/x/example,将其添加到工作区,然后向其中添加一个我们将从 hello 程序中使用的新函数。

1.克隆存储库

在工作区目录中,运行 git 命令来克隆存储库:

$ git clone https://go.googlesource.com/example
Cloning into 'example'...
remote: Total 165 (delta 27), reused 165 (delta 27)
Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (27/27), done.

2.将模块添加到工作区

$ go work use ./example

go work use 命令将一个新模块添加到 go.work 文件中。内容是这样:

go 1.18

use (
    ./hello
    ./example
)

该模块现在包括 example.com/hello 模块和 golang.org/x/example 模块。

这将允许我们使用我们将在模块副本中编写的新代码,而不是使用命令 stringutil 下载的模块缓存中的模块版本。go get

3.增加新函数

我们将向 golang.org/x/example/stringutil 包中添加一个新函数,作用是将字符串大写。

将新文件夹添加到 workspace/example/stringutil 包中,内容如下:

package stringutil

import "unicode"

// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
    r := []rune(s)
    for i := range r {
        r[i] = unicode.ToUpper(r[i])
    }
    return string(r)
}

4.修改 hello 程序以使用该功能。

修改 workspace/hello/hello.go 的内容,如下:

package main

import (
    "fmt"

    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.ToUpper("Hello"))
}

运行 workspace 中的代码

在 workspace 目录下:

$ go run example/hello
HELLO

Go 命令在 go.work 文件指定的 hello 目录中查找 example.com/hello 模块,同样使用 go.work 解析 golang.org/x/example 的导入。

go.work 可以用来代替添加 replace 指令以跨本地的多个工作模块。

由于这两个模块在同一个工作区中,因此很容易实现在一个模块中更改并在另一个模块中使用。

下一步

现在,要正确发布这些模块,我们需要先发布 golang.org/x/example 模块,如:v0.1.0。这通常通过在包对应的仓库上发布 release 提交来完成。 有关更多详细信息,请参阅 模块发布工作流程文档 。发布完成后,我们可以在 hello/go.mod 中增加对 golang.org/x/example 模块依赖声明:

cd hello
go get example.com/[email protected]

如此,go 命令可以正确解析 workspace 之外的模块。

了解有关 workspace 的更多内容

go 命令除了我们在前面教程看到的 go work init 之外,还有几个用于处理工作区的子命令:

  • go work use [-r] [dir] 添加 use 指令到 go.work 文件中,如果参数目录 dir 不存在,则删除该目录。-r 标志表示递归地检查 dir 的子目录。
  • go work edit 编辑 go.work 文件,类似于 go mod edit
  • go work sync 将 workspace 构建列表中的依赖项同步到所有 workspace 模块中。

有关工作空间和 go.work 文件的更多详细信息,请参阅 Go Modules Reference 中的 Workspaces