4.2.1 go.work 文件

go.work文件遵循与go.mod文件相同的语法结构。它是以行为单位的,每行包含一条指令,由一个动词后跟它的参数组成。

允许使用的动词:

use 指定要包含在工作区主模块集合中的模块。

go 指定文件编写时使用的Go版本。

replace 优先于go.mod文件中的replace。

举个例子:

projects/banana-farm/go.work

go 1.19                   // Go 版本

use (                     // 这个工作区包含3个模块
  ./producer
  ./consumer
  ./driver
)

projects/banana-farm/producer/go.mod

module gitlab.com/banana-farm/producer // module指令指定模块路径。go命令应能从此路径中找到此模块。(此示例使用虚构路径仅供说明。)

go 1.19      // Go 版本

projects/banana-farm/producer/farmer.go

package producer

// ...

projects/banana-farm/consumer/go.mod

module gitlab.com/banana-farm/consumer     // 工作区中包含的另一个模块

go 1.19

projects/banana-farm/consumer/grocer.go

package consumer

// ...

projects/banana-farm/driver/go.mod

module driver                                            // 包含 main 包的模块。模块路径并不重要,因为不会引用它

go 1.19

require gitlab.com/banana-farm/producer v0.1.0        // 此模块依赖另外两个模块。require指令使用在这些模块的go.mod文件中使用的相同模块路径
require gitlab.com/banana-farm/consumer v0.1.0

replace gitlab.com/banana-farm/producer => ../producer  // replace指令在此示例中用于指示go命令应使用目录projects/banana-farm/producer和projects/banana-farm/consumer中的Go源文件,而不是远程git存储库中的那些
replace gitlab.com/banana-farm/consumer => ../consumer

projects/banana-farm/driver/main.go

package main

import (
  "gitlab.com/banana-farm/producer"         // 此示例main.go文件依赖于producer模块根目录中的producer包
  "gitlab.com/banana-farm/producer/farm"    // 为了说明,producer模块恰好在projects/banana-farm/producer/farm文件夹中包含另一个包farm
  "gitlab.com/banana-farm/consumer"         // 在所有这三个导入规范中,由于driver/go.mod文件中的replace指令,在构建主包时从本地文件系统获取源文件
)

// Produce 和 consume ...

请注意,在此特定示例中,go.work文件位于三个模块producer、consumer和driver的父目录中。但是,一般来说,这不是必需的。go工作区可以在任何地方创建,并可以使用use指令从任何地方包含模块。

另一点需要注意的是,工作区中的每个模块都可以,并且通常都包含自己的主包。一个模块可以属于多个工作区。

最后更新于