打赏

go-work使用

go work使用

(1.)初始化工作空间

go work init [moddirs]

说明:
moddirs是Go Module所在的本地目录。如果有多个Go Module,就用空格分开。如果go work init后面没有参数,会创建一个空的workspace。

执行go work init后会生成一个go.work文件,go.work里列出了该workspace需要用到的Go Module所在的目录,workspace目录不需要包含你当前正在开发的Go Module代码。
(2.)新增模块

go work use [-r] moddir

说明:
如果带有-r参数,会递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go work文件中。
如果某个Go Module的目录已经被加到go.work里了,后面该目录没有go.mod文件了或者该目录被删除了,那对该目录再次执行go work use命令,该目录的use指令会从go.work文件里自动移除。

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的特定版本或者所有版本的内容。

实践案例

(1.) 总体的目录结构

├── go.work
├── mypkg
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── workmod
    └── cast
        ├── LICENSE
        ├── Makefile
        ├── README.md
        ├── cast.go
        ├── cast_test.go
        ├── caste.go
        ├── go.mod
        ├── go.sum
        └── timeformattype_string.go

(2.) mypkg包中代码
go.mod文件

module mypkg
 
go 1.18
 
require (
    github.com/davecgh/go-spew v1.1.1 // indirect
    github.com/spf13/cast v1.5.0 // indirect
)

main.go

package main
 
import (
    "github.com/davecgh/go-spew/spew"
    "github.com/spf13/cast"
)
 
func main() {
    spew.Dump("1")
    spew.Dump(cast.ToBool("1"))
 
}

(3.)workmod中的文件为下载的第三方包

git clone https://github.com/spf13/cast.git

(3.)在mypkg包外层进行初始化

go work init ./mypkg ./workmod/cast

go.work文件内容如下:
go 1.18

use (
	./work-demo
	./workmod/cast
)

# 执行完成后,生成go.work文件,该文件里通过use指令使用了mypkg和workmod/cast,可以在workmod/cast中修改文件,也可以debug调试,goland中,在External Libaries 中找到Go Workspace,双击Go Module 定位到对应的源文件,在源文件处打断点,即可调试,此时的源文件已经替换为我们在go.work中定义的文件了,而不是go.mod中的文件,go.work优先级高于go.mod

(4.)go work 其他命令
go help work

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
posted @ 2023-06-10 16:54  苍山落暮  阅读(935)  评论(0编辑  收藏  举报