Golang之工作区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 git@github.com: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
常用命令总结:# 初始化工作区go work init [moddirs]
--moddirs 是go Module所在的本地目录,如果有多个go module, 用空格分开, 如果为空,则会创建一个空的workspace ==> 生成go.work # 给工作区新增go module go work use [-r] moddir 或手动编辑go.work文件 -r: 如果带-r,会递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go.work文件中 如果某个Go Module的目录已经被加到go.work里了,后面该目录没有go.mod文件了或者该目录被删除了,那对该目录再次执行go work use命令,该目录的use指令会从go.work文件里自动移除。(注意:自动移除要从Go 1.18正式版本才会生效,Go 1.18beta1版本有bug,自动删除不会生效)
go work sync
把go.work文件中的以来同步到workspace包含的module的go.mod文件中
go work edit: 提供了用于修改go.work的命令行接口,主要给工具或脚本使用
go.work
go.work的语法和go.mod类似,包含如下3个指令:
-
go: go的版本,例如go 1.18 -
use: 添加一个本地磁盘上的Go Module到workspace的主Module集合里。use后面的参数是go.mod文件所在目录相对于workspace目录的相对路径,例如use ./main。use指令不会添加指定目录的子目录下的Go Module到workspace的主Module集合里。 -
replace: 和go.mod里的replace指令类似。go.work里的replace指令可以替换某个Go Module的特定版本或者所有版本的内容。
小结
建立项目 workspace 工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可。虽然,Go workspace 的功能,有点类似 Go module 中的 replace 语句,但是很明显 workspace 在项目统筹方便更加出色,尽早使用起来摆脱依赖恐惧吧。

浙公网安备 33010602011771号