1. 用法:go work <command> [arguments]
  2. command 列表:
    • edit:从工具或脚本编辑 go.work。
    • init:初始化工作区文件。
    • sync:将工作区构建列表同步到模块。
    • use:将模块添加到工作区文件。

go work init

  1. 用法:go work init [moddirs]
  2. init在当前目录中初始化并写入一个新的go.work文件,实际上是在当前目录中创建了一个新的工作空间。
  3. go work init可选择接受工作区模块的路径作为参数。如果省略该参数,将创建一个没有模块的空工作区。
  4. 每个参数路径都添加到go.work文件中的use指令中。 当前的go版本也将列在go.work文件中。
  5. 示例:
1
2
# 初始化一个新的工作区,后面参数就是具体的子模块
$ go work init ./queue ./hello
1
2
3
4
5
6
7
8
9
// 项目目录构成
workspace
|-- queue           # 子模块
|   |-- go.mod
|   |-- queue.go
|-- hello           # 子模块
|   |-- go.mod
|   |-- main.go		
|-- go.work         # 工作区
  1. 通常go.work文件不要提交到git上,因为它主要用于本地代码开发。

go work edit

  1. 用法:go work edit [editing flags] [go.work]。用于编辑go.work文件。
  2. go work edit命令提供了一个用于编辑go.work的命令行界面,主要供工具或脚本使用。
  3. 它只读取go.work;它不查找有关所涉及模块的信息。如果没有指定文件,edit在当前目录及其父目录中查找go.work文件。

editing flags

  1. fmt:重新格式化go.work文件而不进行其他更改。使用或重写go.work文件的任何其他修改也暗示了这种重新格式化。唯一需要此标志的情况是没有指定其他标志。
    • 示例:go work edit -fmt。用于格式化go.work文件。
$ go work edit -fmt
  1. -use=path:从go.work文件的模块目录集中添加use指令。建议使用go work use指令。
    • 示例:go work edit -use=./queue。添加子模块。
$ go work edit -use ./ququq
  1. -dropuse=path:从go.work文件的模块目录集中删除use指令。
    • 示例:go work edit -dropuse=./queue。删除子模块queue。
$ go work edit -dropuse ./queue
  1. -replace=old[@v]=new[@v]:添加了给定模块路径和版本对的替换。
    • 如果old@v中的@v被省略,则添加左侧没有版本的替换,适用于旧模块路径的所有版本。
    • 如果省略new@v中的@v,则新路径应该是本地模块根目录,而不是模块路径。
    • 请注意,-replace会覆盖old[@v]的任何冗余替换,因此省略@v将删除特定版本的现有替换。
    • 示例:go work edit -replace myzx.cn/helium/queue=./queue
$ go work edit -replace myzx.cn/helium/queue=./queue
  1. -dropreplace=old[@v]:删除给定模块路径和版本对的替换。如果省略了@v,则会删除左侧没有版本的替换。
    • 示例:go work edit -dropreplace myzx.cn/helium/queue
$ go work edit -dropreplace myzx.cn/helium/queue
  1. -go=version:设置预期的Go语言版本。
    • 示例:go work edit -go 1.19
$ go work edit -go 1.19
  1. 这些editing flags可以重复使用。 更改按给定的顺序应用。

go work edit有额外的标志来控制它的输出
  1. -print:以文本格式打印最终的go.work,而不是将其写回go.mod。
$ go work edit -print
  1. -json:以JSON格式打印最终的go.work文件,而不是将其写回go.mod。
$ go work edit -json
  1. JSON输出对应于以下Go类型:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
type Module struct {
    Path    string
    Version string
}

type GoWork struct {
    Go        string
    Directory []Directory
    Replace   []Replace
}

type Use struct {
    Path       string
    ModulePath string
}

type Replace struct {
    Old Module
    New Module
}

go work use

  1. 用法:go work use [-r] [moddirs]。use指定使用的模块目录。
  2. go work use命令提供了一个命令行界面,用于将目录(可选地以递归方式)添加到go.work文件中。
  3. use指令将被添加到命令行go.work文件中列出的每个参数目录的go.work文件(如果它存在于磁盘上),或者从go.work文件中删除(如果它不存在于磁盘上)。
    • 删除功能使用:go work edit -dropuse ./queue命令。
  4. -r:递归搜索参数目录中的模块,并且使用命令就像每个目录都被指定为参数一样操作:即,将为存在的目录添加使用指令,为不存在的目录删除使用指令。
    • 递归的添加子模块到当前工作区,这对于子模块引用了很多模块很用用处。
  5. 示例:go work use ./queue,添加queue子模块。
$ go work use ./queue

go work sync

  1. 用法:go work sync。没有参数。
  2. go work sync命令将工作区的构建列表同步回工作区的模块。该命令会修改go.work文件。
  3. 工作区的构建列表是用于在工作区中进行构建的所有(传递)依赖模块的版本集。go work sync使用最小版本选择(MVS)算法生成该构建列表,然后将这些版本同步回工作区中指定的每个模块(使用use指令)。
  4. 一旦计算了工作区构建列表,工作区中每个模块的go.mod文件都会被重写,并使用与该模块相关的依赖项进行升级以匹配工作区构建列表。请注意,最小版本选择保证每个模块的构建列表版本始终与每个工作区模块中的相同或更高。
$ go work sync

go env GOWORK

  1. 查看环境变量,查看当前工作区文件路径。可以排查工作区文件是否设置正确。go.work路径找不到可以使用GOWORK指定。
  2. 示例:
$ go env GOWORK
G:\workspace\go.work
  1. 禁用工作区,直接把GOWORK设置为off即可。