我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情
前言
今天要优化自己的一个模块,突然想到go1.18有个工作空间,只知道这东西比replace好用,具体怎么使用却不太清楚。
于是一遍百度+掘金搜索,越看文章越困惑,直到亲自测试,彻底弄清go work才发现好多文章根本就是复制粘贴,甚至有些文章里出现了“同个目录”的错误言论。
工作空间初步使用
目前go都是通过mod进行包管理,包主要分两类,一类是公网上的,直接引入用go mod管理即可。
一类是本地包,比如你自己写的包或者下载到本地的包,对于这类包,在go 1.18前,都是通过给go.mod中添加replace来修改引用包的实际路径。
这种包引用对于git提交就非常麻烦,每次提交前需要把replace去掉才行。
于是go work被发明了出来。
go work 即工作空间,就是一个目录(文件夹),里边有一个go.work 文件。
H:/work/
go.work
- demo/
main.go
go.mod
go.sum
go.work中的内容如下
go 1.19
use(
H:/information/goserver
./demo
)
注意两个目录路径,工作空间为 H:/work/ 但是模块引用的包路径是 H:/information/goserver,他们可以不在同一个目录下,use后可以跟相对或者绝对路径。
demo一旦放在工作空间下,那么,demo下的go.mod寻找就会通过go.work来实现,而不能像之前在demo下运行go run或者go build 就能自动寻找到go.mod, 所以必须在work目录下运行go use demo,把"./demo" 添加到go.work中,这样你才能在demo项目里引用demo模块中的包。
开始就是不明白这个道理,搞了工作空间,但是没有添加到go.work中,怎么运行怎么都提示本项下的包找不到。
工作空间这一层一般都不会进行git提交,提交的都是工作空间下的各个项目。
命令解析
go.work是整个工作空间的基本配置文件,go.work文件主要用于本地开发使用,不进行git提交。
工作空间初始化
go work init
该命令运行后会生成go.work文件。
go.work推荐在$GOPATH路径上,也可以在项目目录任何一级中,比如有个项目在 "/a/b/c/project",go.work可以在/a 或者/a/b 或者/a/b/c 中,在/a/b/c任何一级目录。注意在上一级中已经存在go.work则,下级目录中无法创建新的go.work。
查询go.work所在位置可以用命令
go env GOWORK
添加项目到工作空间
go work use [-r] [项目1 项目2 ...]
-r 表示递归查找。
项目指包含go.mod的项目
删除用
go work -dropedit=项目
格式化go.work
go work edit -fmt go.work
use replace
go 1.18
use (
./hello
./example
)
replace (
github.com/link1st/example => ./example
)
use 和 replace都是指定本地项目目录
replace 则表示项目中的 github.com/link1st/example 在本地 ./example1中找