go work 笔记 (多模块工作区)

这篇具有很好参考价值的文章主要介绍了go work 笔记 (多模块工作区)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. go work 笔记 (多模块工作区)

1.1. 什么是 go work

go 1.18 引入了功能泛型 (Generics), 同时还引入的多模块工作区 (Workspaces) 和模糊测试 (Fuzzing)。

Go 多模块工作区能够使开发者能够更容易地同时处理多个模块的工作, 如:

  • 方便进行依赖的代码调试(打断点、修改代码)、排查依赖代码 bug
  • 方便同时进行多个仓库/模块并行开发调试

1.2. go work 支持命令

  • 通常情况下, 建议不要提交 go.work 文件到 git 上, 因为它主要用于本地代码开发;
  • 推荐在: $GOPATH 路径下执行, 生成 go.work 文件
  • go work init 初始化工作区文件, 用于生成 go.work 工作区文件

初始化并写入一个新的 go.work 到当前路径下, 可以指定需要添加的代码模块
示例: go work init ./hello 将本地仓库 hello 添加到工作区
hello 仓库必须是 go mod 依赖管理的仓库 (./hello/go.mod 文件必须存在)

  • go work use 添加新的模块到工作区

命令示例:

go work use ./example 添加一个模块到工作区
go work use ./example ./example1 添加多个模块到工作区
go work use -r ./example 递归 ./example 目录到当前工作区
删除命令使用 go work edit -dropuse=./example 功能
  • go work edit 用于编辑 go.work 文件

可以使用 edit 命令编辑和手动编辑 go.work 文件效果是相同的, 示例:

go work edit -fmt go.work 重新格式化 go.work 文件
go work edit -replace=github.com/link1st/example=./example go.work 替换代码模块
go work edit -dropreplace=github.com/link1st/example 删除替换代码模块
go work edit -use=./example go.work 添加新的模块到工作区
go work edit -dropuse=./example go.work 从工作区中删除模块
  • go work sync 将工作区的构建列表同步到工作区的模块

  • go env GOWORK

查看环境变量, 查看当前工作区文件路径 可以排查工作区文件是否设置正确, go.work 路径找不到可以使用 GOWORK 指定

> go env GOWORK
$GOPATH/src/link1st/link1st/workspaces/go.work

1.3. go.work 文件结构

  • 文件结构和 go.mod 文件结构类似, 支持 Go 版本号、指定工作区和需要替换的仓库•文件结构示例:
go 1.18

use (
    ./hello
    ./example
)

replace (
    github.com/link1st/example => ./example1
)

1.4. use 指定使用的模块目录

  • 可以使用 go work use hello 添加模块, 也可以手动修改 go.work 工作区添加新的模块•在工作区中添加了模块路径, 编译的时候会自动使用 use 中的本地代码进行代码编译, 和 replaces 功能类似。
# 单模块结构
use ./hello

# 多模块结构
use (
    ./hello
    ./example
)

1.5. replaces 替换依赖仓库地址

  • replaces 命令与 go.mod 指令相同, 用于替换项目中依赖的仓库地址•需要注意的是 replaces 和 use 不能同时指定相同的本地路径

同时指定报错信息:
go: workspace module http://github.com/link1st/example is replaced at all versions in the go.work file. To fix, remove the replacement from the go.work file or specify the version at which to replace the module.

  • 错误示例

同时在 use 和 replace 指定相同的本地路径

go 1.18

use (
    ./hello
    ./example
)

replace (
    github.com/link1st/example => ./example
)

1.6. go.work 文件优先级高于 go.mod 中定义

  • 在同时使用 go.work 和 go.mod replace 功能的的时候分别指定不同的代码仓库路径, go.work 优先级高于 go.mod 中定义

go.mod 中定义替换为本地仓库 example

replace (
    github.com/link1st/example => ./example1
)

go.work 中定义替换为本地仓库 example1

replace (
    github.com/link1st/example => ./example1
)
  • 在代码构建时候使用的是 go.work 指定的 example1 仓库的代码, go.work 优先级别更高

1.7. 如何使用

  • 在 Go 1.18 go run 和 go build 都会默认使用工作区功能•GOWORK 也可以指定配置 go.work 文件位置
export GOWORK="~/go/src/test/go.18/workspace/go.work"

1.8. 如何禁用工作区

  • Go 全局变量 GOWORK 设置 off 则可以禁用工作区功能

export GOWORK=off

1.9. 开发流程演示

  • 演示如何使用多模块工作区功能。在现在微服务盛行的年代, 一个人会维护多个代码仓库, 很多的时候是多个仓库进行同时开发

  • 假设我们现在进行 hello 仓库开发, 实现的功能是, 实现将输入的字符串反转并输出, 字符串反转功能依赖于 http://github.com/link1st/example (下文统称 example) 公共仓库实现

  • 新建 hello 项目

mkdir hello
cd hello
# 代码仓库启动 go mod 依赖管理, 生成 go.mod 文件
go mod init github.com/link1st/link1st/workspaces/hello
# 下载依赖包
go get github.com/link1st/example
# 编写 main 文件
vim main.go
  • main.go 代码
// Package main main 文件, go 多模块工作区演示代码
// 实现将输入的字符串反转输出并输出
package main

import (
    "flag"
    "fmt"

    "github.com/link1st/example/stringutil"
)

var (
    str = ""
)

func init() {
    flag.StringVar(&str, "str", str, "输入字符")
    flag.Parse()
}

func main() {
    if str == "" {
        fmt.Println("示例: go run main.go -str hello")
        fmt.Println("str 参数必填")
        flag.Usage()
        return
    }

    // 调用公共仓库, 进行字符串反转
    str = stringutil.Reversal(str)
    // 输出反转后的字符串
    fmt.Println(str)
    return
}
  • 运行代码 go run main.go -str “hello world” 或 go run github.com/link1st/link1st/workspaces/hello -str “hello world” 可以看到输出了 hello world 反转以后的字符串
> go run main.go -str "hello world"
dlrow olleh
  • 到这里, 最初的功能已经完成, 但是后续需求变动, 不仅需要输出反转以后的字符串, 还需要将字符串大写•我们则需要去 example 仓库中添加开发 将字符串大写的功能
# 回到工作根目录, 将 common 代码下载到本地进行添加新的功能
# 下载依赖的 example 包
git clone git@github.com:link1st/example.git
# 在 example 包中添加 字符串大学的功能
  • vim example/stringutil/to_upper.go 代码如下
// Package stringutil stringutil
package stringutil

import (
    "unicode"
)

// ToUpper 将字符串进行大写
func ToUpper(s string) string {
    r := []rune(s)
    for i := range r {
        r[i] = unicode.ToUpper(r[i])
    }
    return string(r)
}
  • 由于代码还在本地调试, 未提交 git 仓库中, 这个时候就需要用到 Go 多模块工作区的功能了。

  • 进入项目根目录, 初始化我们现在正在开发的模块

# 初始化 go.work 文件
go work init  ./hello ./example
# 查看 go.work 文件内容
cat go.work
  • 文件结构如下
go 1.18

use (
    ./example
    ./hello
)
  • 回到 hello 项目, vim main.go 将字符串大写的功能添加上。
func main() {
    ...

    // 调用公共仓库, 进行字符串反转
    str = stringutil.Reversal(str)
    // 增加字符大写的功能
    str = stringutil.ToUpper(str)
    // 输出反转后的字符串
    fmt.Println(str)

    ...
}
  • 运行代码

可以看到输出了反转并 大写 的字符串, 大写的函数功能只在本地, 未提交到 git 上, 这样我们就实现了可以同时在两个模块上并行开发文章来源地址https://www.toymoban.com/news/detail-664632.html

go run main.go -str "hello world"
DLROW OLLEH
  • 到这里, 演示的代码已经全部完成

1.10. 总结

  • 使用 Go 多模块工作区的功能, 可以让我们轻松在多个模块之间切换工作, 更能适应现代微服务架构开发。

到了这里,关于go work 笔记 (多模块工作区)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VScode 工作区配置 和 用户配置

    通常不同的项目都有不同的配置,我一般都是使用eslint和prettier一起用,所以经常会有这几个文件: 这里简单介绍一下这几个文件的作用吧。 一般有两个文件,extensions.json和settings.json。 extensions.json 文件是用来配置推荐安装的 VS Code 插件的文件。在这个文件中,你可以列出你

    2024年01月24日
    浏览(52)
  • vscode如何修改工作区(workspaces)目录

    首先 ctrl+shift+P 调出搜索框 其次搜索Workspace settings (json),并打开 打开以后将\\\"path\\\"后的路径由之前的默认路径修改为目标文件夹的完成路径即可。  

    2024年02月11日
    浏览(47)
  • Git——三大分区【工作区 / 暂存区 / 版本区】

    前言 :Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区、暂存区和工作区。   Git的工作区也就是我们平时编辑代码的目录文件夹。   暂存区就是一个 暂时放置修改文件记录 的地方。以往仓库中放货物为例,向仓库中放货物总是一车车的拉,因为如

    2024年02月06日
    浏览(62)
  • git工作区删除了文件想更新回来

    删除了本地dev分支的几个文件,本地dev对应远端dev分支,想更新回来 法一、如果你知道文件夹名称或者文件名称: 法二、工作区的修改,其中就包括删除,这其实都会被git认为正常的操作,即使是你误操作 而针对你的操作,git提供了回退操作,如下图 法三,直接将本地库整

    2024年02月11日
    浏览(59)
  • Azure 机器学习 - 如何使用模板创建安全工作区

    本教程介绍如何使用 [Microsoft Bicep]和 [Hashicorp Terraform]模板创建以下 Azure 资源: Azure 虚拟网络。 以下资源在此 VNet 后面进行保护: Azure 机器学习工作区 Azure 机器学习计算实例 Azure 机器学习计算群集 Azure 存储帐户 Azure Key Vault Azure Application Insights Azure 容器注册表 Azure Bastion

    2024年02月04日
    浏览(47)
  • idea将文件移出git的工作区

    之前使用idea在commit项目时候,忘记添加.gitignore文件了,导致提交了很多无关的文件进入远程仓库,网上有教程是使用git - reset head 方法,但是这个方法只是将上一次的commit文件覆盖当前的暂存区文件,而非移除暂存区文件,所以没有用   但是在idea工具好像并没有提供将文件移

    2024年02月13日
    浏览(45)
  • 注册claude AI账号 slack工作区账号

    Claude 是建立在 slack工作区的一个AI人工助手,更像是将chatgpt集成到了会议模式,一个账号实际上拥有了你的会议室和你的AI助手,你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物?目前还不知道,不过就从回复速度来看,他比chatgpt和通过api调用的第三方

    2023年04月18日
    浏览(81)
  • git 将其它分支的文件检出到工作区

    主要是使用如下命令: 覆盖与 pathspec 匹配的文件的内容。当没有给出 tree-ish (通常是一个commit)时,用 index 中的内容覆盖工作树。当给出 tree-ish 时,用 tree-ish 处的内容同时覆盖 index 和工作树。 由于前一个的合并失败,index 可能包含未合并的条目。默认情况下,如果您试图从

    2023年04月09日
    浏览(39)
  • git在工作区和本地库的操作命令

     本文介绍一些开发时,常用的在工作区和本地库之间的操作命令 工作树的修改内容要提交到本地库,首先需要先添加到缓存区stage,在commit到本地库。 你开发了一段时间,可能已经忘记了修改过那几个文件 可以使用 git status 查看 工作区和缓存区的内容 ,即修改过的文件和

    2024年02月15日
    浏览(43)
  • Git分支管理的原理 & 工作区、暂存区的分支共享

    首先,Git是 版本 控制系统,所以Git的存储基本数据单元是不同的 版本对象 ,对应的就是不同的commit。换句话说,我们每commit一次,就是一个版本,也就是一个Git存储单元。 2.1 只有 main 分支时 当只有main分支时,在修改过文件且进行git add 和 git commit 操作后,目前的文件就会

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包