Golang之工作区workspace

发布时间 2023-07-27 20:48:27作者: X-Wolf

快速开始

创建工作区

写一个最简单的基础项目实际演练一下 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

 

小结

建立项目 workspace 工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可。虽然,Go workspace 的功能,有点类似 Go module 中的 replace 语句,但是很明显 workspace 在项目统筹方便更加出色,尽早使用起来摆脱依赖恐惧吧。