Skip to content

Go Work

版本要求:Go 1.18+

起因(适用场景)

前置

项目(模块) -> 包(package)

  • 项目(模块)指目录下有 go.mod 文件的那个目录,以 go.mod 文件所在的目录为项目根目录
  • 包(package)指项目中更小一级的管理单位

另一个项目未发布

遇到多项目开发时,比如 A1 和 A2 是两个项目,也就是两个模块,彼此进行开发,彼此都未发布,而在 A1 中引用了 A2。因为 A2 没发布,所以会引用失败,以前的做法是在 A1 的 go.mod 中使用 replace 指令:replace A2 => ../A2,到时候等 A2 发布后,准备发布 A1 时把这句去掉。要是忘了就麻烦了。

使用方法

创建一个工作区目录 work_dir,在此目录下创建项目,例如 hello/、util,要求每个项目下都有 go.mod 文件。

在 work_dir 目录下执行:go work init,会生成一个 work_dir/go.work 文件。其语法与 go.mod 相同,多了一个 use 指令。其他的如 replace 指令,其优先级比 go.mod 中的 replace 高。

接下来在项目中正常引用就行了。

[work_dir]
 ├── go.work
 │   +──────────+ 
 │   │ go 1.18  │  
 │   │          │
 │   │ use ( │   │  ./hello │
 │   │  ./util  │
 │   │ ) │   +──────────+
 ├── [hello]
 │    ├── go.mod
 │    │   +──────────────────────────────────+
 │    │   │ module abc.com/hello_demo        │
 │    │   │                                  │
 │    │   │ go 1.18                          │
 │    │   │                                  │
 │    │   │ require abc.com/util_demo v0.0.0 │
 │    │   +──────────────────────────────────+
 │    │  
 │    └── main.go
 │        +─────────────────────────────────────────+
 │        │ package main                            │
 │        │                                         │
 │        │ import ( │        │     "abc.com/util_demo" │        │ ) │        │                                         │
 │        │ func main() { │        │     util.Assert(1==1, "panic message.") │        │ } │        +─────────────────────────────────────────+
 └── [util]
      ├─── go.mod 
      │   +──────────────────────────+
      │   │ module abc.com/util_demo │
      │   │                          │
      │   │ go 1.18                  │
      │   +──────────────────────────+
      └── main.go
          +──────────────────────────────────────+
          │ package util                         │       
          │                                      │
          │ func Assert(cond bool, msg string) {if cond {return}          │     panic(msg)}          +──────────────────────────────────────+