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)                                  }                                              +──────────────────────────────────────+