先说一下,为什么我需要 Go workspace
。 在 github.com/x-mod 中,我写了非常多的基础包/工具包,有公有的,也有很多私有的。
在日常项目中,会大量的使用到这些基础包。 项目、基础包之间的关系图常常是这样的:
项目实际关系图只会比这个复杂。这时,如果需要修改底层包,比如说 G
, 所有在 项目包
中虽然是直接使用,但是同时,它又被 F
包使用,而 F
包又被 C
包使用。
更新 G
后,同时 F
包和 C
包需要更新相应的 G
包版本号,虽然最终这些包是需要做相应升级的。
但是,如果在 项目包
的开发过程中,频繁的进行底层包以及关联包的版本升级,很快就会让人厌烦 Go Module
的。
所以,Go workspace
的出现,很大程度解决了开发过程中频繁升级基础依赖包版本的问题。
快速开始
创建工作区
写一个最简单的基础项目实际演练一下 Go workspace
。
首先,创建 workspace
工作区。
$: mkdir workspace
$: cd workspace
$: go work init
完成以上步骤后,工作区目录就会出现一个新的文件 go.work
. 内容是这样的:
go 1.18
因为工作区暂时是空的,所以只有一个版本信息。Go workspace
的使用版本:go version >= 1.18
.
创建项目
创建一个基础项目 demo
, 过程如下:
$: cd workspace
$: mkdir demo
$: go mod init demo
添加基础代码, demo/main.go
:
package main
import "fmt"
func main() {
fmt.Println("hello, go workspace")
}
增加一个基础依赖包: github.com/liujianping/foo
, 命令
$ go get github.com/liujianping/foo
这是以前 Go Module
刚发布时写的依赖包,借来直接用。修改 demo/main.go
:
package main
import (
"fmt"
"github.com/liujianping/foo"
)
func main() {
fmt.Println(foo.Greet("workspace"))
}
现在在 demo
目录中运行: go run main.go
, 发现 demo
运行失败。
$: go run main.go
main.go:6:2: no required module provides package github.com/x-mod/foo: go.mod file not found in current directory or any parent directory; see 'go help modules'
这时因为在 demo
的父级目录中发现了 go.work
文件,而 go.work
中没有使用任何项目包或依赖包,所以 workspace
工作区无法工作导致。
工作区操作
现在将 demo
项目增加到工作区。
$: cd workspace
$: go work use ./demo
查看工作区文件 go.work
:
go 1.18
use ./demo
重新运行项目:
$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1
再将 github.com/liujianping/foo
clone 到工作区:
$: cd workspace
$: git clone [email protected]:liujianping/foo.git
现在,工作区目录到结构是这样的:
$: cd workspace
$: tree .
.
├── demo
│ ├── go.mod
│ ├── go.sum
│ └── main.go
├── foo
│ ├── foo.go
│ └── go.mod
└── go.work
直接修改 foo.go
文件:
package foo
import "fmt"
func Greet(name string) string {
return fmt.Sprintf("%s, 你好! Version 2.0.1", name)
}
版本号修改一下。重新运行 demo
项目:
$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 1.0.1
发现输出并未发生改变。这是因为,github.com/liujianping/foo
虽然代码已经 clone
下来,但在 go.work
文件中尚未使用。
$: cd workspace
$: go work use ./foo
查看工作区文件 go.work
:
go 1.18
use (
./demo
./foo
)
再次运行项目:
$: cd workspace
$: go run demo/main.go
Go Workspace, 你好! Version 2.0.1
小结
建立项目 workspace
工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可。虽然,Go workspace
的功能,有点类似 Go module
中的 replace
语句,但是很明显 workspace
在项目统筹方便更加出色,尽早使用起来摆脱依赖恐惧吧。