当前位置: 首页 > news >正文

go.work工作区

go.work工作区

教程:多模块工作区入门 - Go 编程语言 - Go 编程语言

Go 1.18 引入。

工作区的作用是在一个“大工程”中,同时管理多个“子工程”,且这几个“子工程”之间可以方便地直接相互引用,而不再查找远程仓库的同名依赖(replace指令)。可见工作区本身属于临时开发配置,不属于发布配置。

使用

一般情况(个人小项目、团队内没有同时负责多个工程)下是用不到工作区的,用到工作区的情况都是一个人同时要维护多个工程,此时对工程在本地修改后,代码合入前,这些修改无法从远程仓库拉取得到(因为都在本地),因此需要让其他依赖此工程的工程,使用replace指令来将其依赖重定向到本地的版本。而工作区就是方便管理这些replace指令的。

在Go 1.18以前,如果遇到以下场景:Module A新增了一个feature,Module B需要使用Module A的这个新feature,你有2种方案:

  • 发布Module A的修改到代码仓库,Module B更新依赖的Module A的版本即可
  • 修改Module B的go.mod,使用replace指令把对Module A的依赖指向你本地未发布的Module A所在目录。等Module A发布后,在发布Module B的时候,再删除Module B的go.mod文件里的replace指令。

有了Go工作区模式之后,针对上述场景,我们有了更为简单的方案:你可以在工作区目录维护一个go.work文件来管理你的所有依赖。go.work里的usereplace指令会覆盖工作区目录下的每个Go Module的go.mod文件,因此没有必要去修改Go Module的go.mod文件了。

注意

  • 工作区只能用于使用Go Modules管理的工程
  • 通常情况下, 建议不要提交 go.work 文件和 go.work.sum 到 git 上, 因为它主要用于本地代码开发,属于临时配置

go.work文件

go.work 文件示例(Go Modules 参考 - Go 编程语言 - Go 编程语言):

# 指定工作区的go版本
go 1.18
# 相对路径是相对go.work文件的路径
# 指定哪些go.mod会加入编译,这个指令不会递归
# 假设your-module引用了upstream-mod,那么还相当于自动给your-module添加了replace指令,将upstream-mod重定向到本地path-to-upstream-mod-dir的版本
use (./path-to-upstream-mod-dir./path-to-your-module
)replace (golang.org/x/net v1.2.3 => ./fork/netgolang.org/x/net => ./fork/net
)

注意

  • go.work 文件中的定义优先于 go.mod 的定义,比如同时在 go.workgo.mod 中 replace 分别指定不同的代码仓库路径,实际采用的是 go.work 中的。

常用命令

  • go env GOWORK 查看当前工作区根路径(就是 go.work 的绝对路径)

  • go run/build 工作区被use的目录 编译工作区中的指定模块

  • go work init 初始化工作区文件, 用于生成 go.work 工作区文件

    # hello目录必须存在,且其下必须存在go.mod文件
    go work init ./hello
    
  • go work use 添加go模块到工作区

    # 添加一个模块到工作区
    go work use ./example
    # 添加多个模块到工作区
    go work use ./example ./example1
    # 递归查找-r后面的路径参数下的所有子目录,把所有包含go.mod文件的子目录都添加到go work文件中
    go work use -r ./example
    
  • go work edit 用于编辑 go.work 文件。手动编辑该文件也可以,这个命令是方便给命令行工具使用。

    # 重新格式化 go.work 文件
    go work edit -fmt 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 edit -json
    # 查看工作区模块列表
    go work use
    
  • go work syncgo.work文件里的依赖同步到workspace包含的各Module的go.mod文件中。比如go.work中use了app模块和utils模块。现在 app 模块依赖了 utils 模块的v1.0.0版本。现在 utils 远端升级到了 v1.1.0 版本,因此我们在 app/go.mod 中添加了 require example.com/utils v1.1.0 指令。同时本地的 utils 包应该手动拉取更新(因为go.work中use了会让go编译时使用本地的版本)或者用 go work sync 来检查依赖的 utils 是不是期望的 v1.1.0 版本。

http://www.hskmm.com/?act=detail&tid=27158

相关文章:

  • 2025 房屋改造设计公司最新推荐榜:覆盖全场景需求,精准匹配老房 / 小户型 / 局部改造优质品牌
  • 2025 年最新推荐碳纤维布源头厂家口碑排行榜:实力企业重点项目案例与选择指南全解析建筑/加固/300克/碳纤维加固布厂家推荐
  • 如何在AutoCAD中进行GIS建库?
  • Java方法的值传递机制学习笔记
  • Gitee发布MCP Server:重新定义AI赋能的代码协作新时代
  • 小程序上传文件,如发票
  • AI问答与搜索引擎:信息获取的现状
  • 2025 年别墅电梯优质厂家最新推荐排行榜:聚焦技术安全与市场口碑,助力业主精准选购家用/自建房/电梯维修/电梯加装/电梯改造/老旧小区加装电梯厂家推荐
  • 跨网文件摆渡系统是什么?你想了解的问题都在这!
  • 使用Grok获取Sora2邀请码
  • 一文详解企业如何借助AI技术重构业务基因(附发展趋势、关键能力、具体策略)
  • 课后作业一
  • SQLServer给已有数据的表增加 自增字段
  • ESP32 wroom 32d 和 SMT32 F103C8T6 引脚图
  • 提示缺少xxx.dll文件,DLL修复工具 全系列完整版 (支持32位/64位winxp/win7/win10/win11系统)
  • 2025 年电线电缆厂家最新推荐实力厂家榜单:聚焦优质企业,助力精准选购
  • 基于MATLAB的火灾检测GUI系统设计与实现
  • 博客园登录bug
  • 基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行步骤
  • 第五届无线通信、网络与物联网国际学术会议
  • 2025 年低温冷水机厂家联系方式推荐:广东弘星制冷专注工业温控,提供定制设备与管家式服务
  • 精准对决:Snipaste 与 FastStone Capture 截图工具优劣势深度剖析
  • vs code python 环境移植
  • 第六届信息科学与并行、分布式处理国际学术会议(ISPDS 2025)
  • MATLAB遗传算法优化RBF网络连接权与网络结构的实现方法
  • Java方法之可变个数形参(Varargs)学习笔记
  • 2025 年热缩管制造厂家最新推荐排行榜:氟橡胶 / 双壁 / 线缆标识 / 防滑花纹 / DR 耐油橡胶 / PVDF / 航插用 / 军用热缩管优质企业品牌全面盘点
  • 10-9
  • 2025 建筑工程施工总包公司最新推荐榜:揭秘 5 家优质企业,以质量管控与创新实力引领行业发展
  • 2025 年板材厂家最新推荐排行榜:胖胖熊等六大优质品牌深度解析,助您选对环保、耐用、高性价比装修板材ENF级/环保/密度/净化/零醛添加/装修板材厂家推荐