Go 1.18 multi-module workspaces 多模块工作区教程
引言
当前,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 不需要提交
转载自:https://juejin.cn/post/7094075987079462925