16.2.1 工作区设置

首先,让我们为我们的“堆栈库”创建一个 go 模块。

$ mkdir stack-demo && cd $_                  // stack-demo是我们的项目文件夹。$_指的是BASH中使用的最后一个参数
$ mkdir stack && cd $_                       // 堆栈库的模块文件夹
$ go mod init gitlab.com/.../stack-demo/stack// 完整的路径被省略了,go mod init命令在当前目录下创建一个新的go.mod文件
$ cd ..                                      // 这时,我们回到了堆栈-演示目录(在某个未指定的父文件夹/路径下)

尽管对于这样一个简单的项目来说并不是真正必要的,但我们将创建一个单独的模块"驱动/测试 "程序,为了练习,我们将使用go工作区来管理这两个模块。

$ go mod init gitlab.com/.../stack-demo                // 尽管go模块大致相当于一个目录层次,go.mod文件位于其根/顶目录,但go模块不需要在相互排斥的位置创建。为了说明问题,我们要在堆栈模块的父目录下创建这个新模块。
$ go mod edit -require \
              gitlab.com/.../stack-demo/stack@v0.1.0   // go.mode edit -require命令用于指定模块的依赖关系
$ go mod edit -replace \
              gitlab.com/.../stack-demo/stack=./stack  // 这是在开发过程中常见的做法,这样可以使用本地文件,这些文件可能是最新的,而不是已经推送到远程资源库的文件
$ go work init                                         // go工作区不一定要在特定的位置创建,例如相对于它的模块,正如本书开头所解释的。但如果可行的话,项目目录(例如包括其他模块)通常是一个不错的选择。在这个例子中,工作区和驱动模块位于同一个文件夹中
$ go work use stack                                    // go work use命令用于向给定的工作区添加模块。在这个例子中,我们为堆栈库添加堆栈(.../stack-demo下的相对路径),为驱动程序添加.(.../stack-demo)
$ go work use .

此时,项目目录可能如下所示:

$ tree .               // tree是一个Unix/Linux shell命令,它以树状格式列出目录的内容
.
├── go.mod
├── go.work
└── stack
    └── go.mod

1 directory, 3 files

go.work 文件:

go 1.19

use (
    ./
    ./stack    // 注意,它被指定为./stack,而不仅仅是stack。这超出了本书的范围,但只是作为一个说明,当你使用现代go工具链时,你需要注意这种惯例。应该注意的是,除其他事项外,GOROOT和GOPATH环境变量(仍然)被go命令使用
)

驱动程序模块的 go.mod 文件:

module gitlab.com/.../stack-demo      // "..."不是模块路径/名称的有效语法

go 1.19

require gitlab.com/.../stack-demo/stack v0.1.0    // 这一行是运行go mod edit -require命令的结果,如上图所示。没有必要总是使用go命令。你可以手动编辑go.work和go.mod文件
replace gitlab.com/.../stack-demo/stack => ./stack// 同上。这是运行go mod edit -replace命令的结果

堆栈库模块的 go.mod 文件:

module gitlab.com/.../stack-demo/stack

go 1.19

最后更新于