go work 工作区
go 1.18 开始支持工作区模式,主要解决对go mod依赖包的开发管理
假如我的项目依赖了这两个包
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 )
此时我发现cast包有bug或者需要对cast包加入新功能,那我就需要对cast包进行开发,在1.18前对依赖包进行开发调试是很麻烦的
从1.18后就可以go work进行开发调试了, 具体步骤如下
我当前的代码
go.main
package main import ( "github.com/davecgh/go-spew/spew" "github.com/spf13/cast" ) func main() { spew.Dump("1") spew.Dump(cast.ToBool("1")) }
当前的目录结构
mypkg ├── go.mod ├── go.sum └── main.go
此时运行 go run main 输出
(string) (len=1) "1" (bool) true
此时我们需要带cast包的ToBool进行开发调试
我们需要去到当前目录的上一级
创建目录 workmod(这一步可要可不要,只要一会儿指定的目录对就行,只要这个目录不要放在mypkg里面就行)
然后进入workmod下
git clone https://github.com/spf13/cast.git
然后进入到workmod和mypkg的父级目录
go work init ./mypkg ./workmod/cast
此时项目结构变成
. ├── 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
我们的代码在mypkg中,需要开发的第三方依赖在workmod中,我们可以把所有需要开发的依赖都放在workmod下,然后加入到go.work中进行开发调试
此时我们修改workmod/cast/cast.go 中的CastToBool方法
// ToBool casts an interface to a bool type. func ToBool(i interface{}) bool { fmt.Println("in go work") v, _ := ToBoolE(i) return v }
然后再进入mypkg中运行 go run main 输出
(string) (len=1) "1" in go work (bool) true
此时我们对cast的依赖就成了本地这个文件了,对 go-spew等其他依赖保持不变
上面的流程已经满足大部分需求了, go work还有其他的一些命令,具体可以用help查看,
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.