当前栏目
Go 1.18 新增三大功能之一“工作区模式”介绍
1.介绍
Go 官方在 Go v1.11 新增 Go Modules 模式,并一直持续到 Go v1.16,每个版本的 Go Modules 模式都会有一些变化。但是,我们的项目使用 Go Modules 模式时,仍然会遇到一些问题。
直到 Go v1.18 版本新增 Workspaces 模式,解决了 Go Modules 模式的这些问题,本文我们介绍 Workspaces 模式的使用方式。
2.引言
当在项目中需要导入一些私有 Git 仓库或未发布到 Git 仓库的依赖项时,或需要修改三方依赖模块的代码时,一般解决方法是将代码下载到本地,在 go.mod 文件中使用 Go Modules 模式中的 replace 指令替换为本地目录路径。
因为 go.mod 文件也是和项目一起提交到 Git 仓库,每个开发人员的本地目录路径可能不一样,所以,就需要把在远程仓库拉取到的 go.mod 文件中 replace 的目录路径手动替换为自己的本地目录路径之后,才可以正常使用。
3.使用方式
在介绍 Workspaces 模式的使用方式之前,我们需要先使用 Go Modules 模式创建一个 Go 项目,并且我们的 Go 项目依赖模块 golang.org/x/example。
创建 Go 项目
示例代码:
输出结果:
阅读上面这段内容,是我们已经非常熟悉的使用 Go Modules 模式创建 Go 项目的操作步骤,接下来,我们介绍 Workspaces 模式的使用方式。
创建工作区
执行完以上命令,我们可以发现在 workspace 目录下创建了一个 go.work 文件,查看该文件,我们可以发现包含两个指令,分别是 go 和 use。
其中 go 指令,是指定使用 Go 的哪个版本编译项目,类似 go.mod 文件中的 go 指令。
其中 use 指令,是指在构建项目时,hello 目录中的模块是主模块。
在创建工作区后,我们进入工作区目录,运行 main.go 文件。
输出结果:
但是,如果我们进入 Home 目录(工作区外),运行 main.go 文件。
输出结果:
我们可以在输出结果中发现,Go 找不到项目使用的依赖模块,原因是我们在工作区外运行 Go 项目,Go 找不到需要的模块。
4.使用场景
我们在学会使用 Workspaces 模式后,使用该模式解决 Part 02 提到的问题。
假如我们想要在 Go 项目的依赖模块 golang.org/x/example 新增一个函数 ToUpper。
在 Go 未提供 Workspaces 模式时,我们需要下载依赖项到本地,然后修改下载到本地的依赖项文件。
此时,我们就可以修改我们下载到本地的依赖项文件 /Users/frank/workspace/hello/example/stringutil/reverse.go,新增函数 ToUpper。
然后,我们可以在 main.go 文件中使用该函数。
输出结果:
使用 Go Modules 模式的 replace 指令,虽然可以实现我们的需求,但是,当该项目代码在其他人电脑上运行时,必须先手动修改为自己的目录路径,才可以正常运行。
使用 Workspaces 模式
我们使用 Go 1.18 提供的 Workspaces 模式,实现我们的需求。
将下载到本地的依赖模块 example 添加到工作区:
我们使用 go work use 命令将 example 模块添加到工作区,我们就可以使用我们下载到本地的依赖模块 example 的代码,而不再使用 GOMODCACHE 中的 example 模块的代码。
我们项目组成员只需维护自己本地的工作区,不必再手动修改 go.mod 文件中 replace 指令中的本地目录路径。
5.总结
本文我们先叙述使用 Go Modules 模式面临的一些问题,然后介绍 Go v1.18 新增的 Workspaces 模式的使用方式,最后通过示例介绍使用 Workspaces 模式可以解决使用 Go Modules 模式中的问题。
需要注意的是,go.work 文件不要推送到远程仓库,我们可以将其添加到 .gitignore 文件中。
我们在文中使用到的命令是 go work init 和 go work use,此外,还有其他命令,感兴趣的读者朋友们可以执行命令 go help work 了解更多。
相关文章
- nodejs 解决sql注入方案
- nvm-windows管理nodejs版本神器——代理和镜像配置
- 关于node代码如何丝滑执行多条命令行这件事
- JavaMoney规范(JSR 354)与对应实现解读
- Node.js 应用全链路追踪技术——[全链路信息获取]
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
- Node.js 模块化你所需要知道的事
- 初识 D3.js :打造专属可视化
- knockoutjs如何动态加载外部的file作为component中的template数据源
- NodeJs和NPM的基本操作
- 使用 System.Text.Json 时,如何处理 Dictionary 中 Key 为自定义类型的问题
- 如何使用 System.Text.Json 序列化 DateTimeOffset 为 Unix 时间戳
- javascript使用正则表达式替换或者捕获子字符串
- FastAPI从入门到实战(14)——JSON编码兼容与更新请求
- node与浏览器中的cookie
- 使用JSONPath解析json数据
- JS函数hook
- JS代码之混淆
- JS代码之还原