likes
comments
collection
share

Go 1.18 multi-module workspaces 多模块工作区教程

作者站长头像
站长
· 阅读数 24

引言

当前,Go module的最常见的挑战是跨多个module工作。Go 1.18版本通过新的Go工作区模式(Go workspace mode)解决了这一问题,这使得在多个module中工作变得简单。本文简单介绍下 workspace 的使用方式以及使用场景。

关于Go Modules的使用可以参考这篇文章: Go Modules 必知必会

Go multi-module workspaces官方文档 :go.dev/doc/tutoria…

Go work 使用教程

1. 创建一个工作空间

$ mkdir workspace
$ cd workspace

2. 创建一个项目

$ mkdir work_demo
$ cd work_demo
$ go mod init github.com/starine/work_demo
go: creating new go.mod: module github.com/starine/work_demo

接着执行:go get github.com/starine/goset

在 workspace/work_demo 文件夹下,创建 work_demo.go

package main

import (
    "fmt"
    mapset "github.com/starine/goset"
)

func main() {
    s := mapset.NewSet(8, "beijing")
    fmt.Println(s.Contains(8)) 
}

output:

true

3. 下载和更改依赖包goset 做测试

因为需求的变更,依赖的 goset 的功能更改了,但是不确定更改的是否正常,我们需要用 work_demo 项目来测试。

比如:git clone git@github.com:starine/goset.git, goset 的更改如下,

package goset

import "fmt"

...

func (s *set) Add(items ...interface{}) {
	for _, item := range items {
		s.m[item] = exists{}
	}
}
...

// Size 新增set集合大小的功能
func (s *set) Size() int {
	return len(s.m)
}

如何使用 work_demo 项目来测试呢?

在没有 go1.18 之前,只能使用 replace,如下:

module github.com/starine/module-demo


go 1.17

require github.com/starine/goset v1.0.0

replace (
 github.com/starine/goset =>  "D:/code/go/starine/workspace/goset"
)

这样做程序能正常测试,但是带来一个问题,我们要修改 go.mod,一不留神这个 replace 过的 go.mod 就上传到 github 了。

为了解决这个问题,Go1.18引入了workspace来解决

$ cd workspace
$ go work init ./work_demo

会在 workspace 下生成一个 go.work文件

go 1.18

use ./work_demo

这个时候,我们把 goset 项目移动到 workspace 目录下,然后执行:

go work use ./goset

go.work的更改如下:

go 1.18

use (
 ./goset
 ./work_demo
)

work_demo.go更改如下:

package main

import (
    "fmt"
    mapset "github.com/starine/goset"
)

func main() {
    s := mapset.NewSet(8, "beijing")
    fmt.Println(s.Contains(8)) 
    fmt.Println(s.Size())
}

output:

true
2

使用 go work,我们不需要对 work_demo 项目的 go.mod 做任何操作就能正常测试项目的修改。真的非常方便。

Go work 使用场景及注意点

使用场景

  • 本地调试。

比如,公司内部开发时,一般都会沉淀出一个 common 的组件项目,这个组件项目可能会有很多人修改,这个项目修改后本地测试,使用 go work 会很方便快捷。

注意点

  • 测试的项目和被测试项目必须位于同一个文件夹下。如本文中的 work_demo 与 goset 必须都在 workspace 文件夹下
  • go.work 不需要提交