前言
Go在早期没有一个成熟的依赖管理解决方案,将所有文件代码存放在GOPATH目录下,对于工程项目而言十分混乱、不友好,依赖难以管理。到Go1.11版本,官方推出了Go Mod依赖管理工具,也是目前最流行的依赖管理。
当使用Go Mod进行项目管理时,模块缓存默认存放在$GOPATH/pkg/mod
目录下,也可以修改$GOMODCACHE
来指定存放在另外一个位置。
工作区(workspace)是Go在1.18版本中引入的多模块管理的方案。原来在本地中依赖其他模块但又没有上传到远程仓库,一般使用replace指令。而工作区就可以解决多模块管理问题。
工作区的使用
go mod进行包管理主要分为两类,一类是公网上的,直接引入用go mod管理即可;另一类是本地包,go mod是通过replace来修改引用包的实际路径。这种包引用对于git提交就非常麻烦,每次提交前需要把replace去掉才行。所以使用go work(工作区),就是在一个目录(文件夹)中有一个go.work文件。go.work文件示例如下:
go 1.19
use (
./Demo1
./Demo3
D:/GoPath/GoProject/Demo2
)
其中,可以使用多个模块引用包路径,能够使用绝对地址和相对地址【就是use后面加包模块路径】。
这些模块,如Demo1,一旦放在工作区中,Demo1下的go.mod寻找就会通过go.work来实现,所以需要在go work目录下运行go work use <Demo1-path>,这样就能在Demo1项目中引用Demo1模块中的包,或者其他项目包(go work use 其他模块)。
go.work是整个工作区的基本配置文件,用于本地开发使用,不进行git提交。
初始化workspace
在选定目录下运行,go worl init 命令后会生成一个go.work文件。若该文件目录的上一级中已经存在go.work,则该目录无法创建新的go.work。
使用$go env GOWORK
可以查看go.work所在位置。
添加项目到workspace
使用命令go work use [-r] [project1_path project2_path ...]
将项目添加至workspace中,其中-r表示递归查找。项目表示包含go.mod的模块。
workspace中使用replace
在go.work中使用replace,那么所有工作区中项目在引用该包时会从替代路径项目中引用。
go 1.19
use (
./Demo1
./example
)
replace (
github.com/link1st/example => ./example
)
比如,该go.work文件,工作区中项目在引用github.com/link1st/example包时会使用本地./example包进行替代。