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
最后更新于