go work 工作区

时间:2025-02-27 07:39:56

go 1.18 开始支持工作区模式,主要解决对go mod依赖包的开发管理

假如我的项目依赖了这两个包

1

2

3

4

5

6

7

8

module mypkg

go 1.18

require (

    /davecgh/go-spew v1.1.1 // indirect

    /spf13/cast v1.5.0 // indirect

)

此时我发现cast包有bug或者需要对cast包加入新功能,那我就需要对cast包进行开发,在1.18前对依赖包进行开发调试是很麻烦的

从1.18后就可以go work进行开发调试了, 具体步骤如下

我当前的代码


 

1

2

3

4

5

6

7

8

9

10

11

12

package main

import (

    "/davecgh/go-spew/spew"

    "/spf13/cast"

)

func main() {

    ("1")

    (("1"))

}

当前的目录结构

1

2

3

4

mypkg

├── go.mod

├── go.sum

└── main.go

此时运行 go run main 输出

1

2

(string) (len=1) "1"

(bool) true

此时我们需要带cast包的ToBool进行开发调试

我们需要去到当前目录的上一级

创建目录 workmod(这一步可要可不要,只要一会儿指定的目录对就行,只要这个目录不要放在mypkg里面就行)

然后进入workmod下

1

git clone https:///spf13/

然后进入到workmod和mypkg的父级目录

1

go work init ./mypkg ./workmod/cast

此时项目结构变成

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

.

├── go.work

├── mypkg

│   ├── go.mod

│   ├── go.sum

│   └── main.go

└── workmod

    └── cast

        ├── LICENSE

        ├── Makefile

        ├──

        ├── cast.go

        ├── cast_test.go

        ├── caste.go

        ├── go.mod

        ├── go.sum

        └── timeformattype_string.go

我们的代码在mypkg中,需要开发的第三方依赖在workmod中,我们可以把所有需要开发的依赖都放在workmod下,然后加入到中进行开发调试

此时我们修改workmod/cast/ 中的CastToBool方法

1

2

3

4

5

6

// ToBool casts an interface to a bool type.

func ToBool(i interface{}) bool {

    ("in go work")

    v, _ := ToBoolE(i)

    return v

}

然后再进入mypkg中运行 go run main 输出

1

2

3

(string) (len=1) "1"

in go work

(bool) true

此时我们对cast的依赖就成了本地这个文件了,对 go-spew等其他依赖保持不变

上面的流程已经满足大部分需求了, go work还有其他的一些命令,具体可以用help查看,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

go help work

Usage:

        go work <command> [arguments]

The commands are:

        edit        edit go.work from tools or scripts

        init        initialize workspace file

        sync        sync workspace build list to modules

        use         add modules to workspace file

Use "go help work <command>" for more information about a command.