沙滩星空的博客沙滩星空的博客

Golang之workspace工作区模式

使用多模块工作区,您可以告诉 Go 命令您正在 同时在多个模块中编写代码.

multi-module workspaces 多工作区模式,要求go版本 >= Go 1.18

需求分析

加入现在我们把一个大的项目分成了两个项目,一个项目是基础模块,用来实现项目的公用功能。第二个项目要依赖第一个项目,注意:这里提到的是项目,而不是模块。解决方法有二:

  1. 把第一个项目创建好,提交到github,第二个项目使用 go get 下载。
  2. 使用Golang1.18里面的新功能workspace。

第一种方法有一个缺陷就是,如果我们频繁的修改代码,那么第二个项目就要不停的更新,否则版本就不是最新的。而第二个方法就没有这个问题,项目可以在本地依赖。

实现步骤

  1. 建立项目目录 myworkspace
  2. myworkspace 目录,建立 commonmyproject_1 两个 go mod 子项目
  3. myworkspace 目录,使用命令 go work init common 初始化 workspace 多工作区模式
  4. myworkspace 目录,使用命令 go work use myproject_1 添加 myproject_1 目录到工作区
  5. myworkspace 目录,运行 go run myproject_1/main.go。 也可编译 myproject_1 为二进制可执行文件

操作最终生成一个 go.work 文件

  • 工作区目录,必须为 go mod 项目,必须包含 go.mod 文件
  • 工作区初始化可一次性添加多个目录。如: go work init common myproject_1
  • 实际项目中,多个模块之间可能还依赖其他模块,建议在 go.work 所在目录执行 go work sync

最终目录结构如下:

.
└── myworkspace
    ├── common
    │   ├── common.go
    │   └── go.mod
    ├── go.work
    └── myproject_1
        ├── go.mod
        └── main.go

3 directories, 5 files

创建 myworkspace 主项目

mkdir myworkspace
cd myworkspace

创建 common 子项目

mkdir common
go mod init common
vim common.go

myworkspace/common/common.go

package common

import "fmt"

func Dosomething() {
    fmt.Println("do something...")
}

创建 myproject_1 子项目

cd .. && mkdir myproject_1 && cd myproject_1
go mod init myproject_1
vim main.go

myworkspace/myproject_1/main.go

package main

import "common"

func main() {
    common.Dosomething()
}
// package common is not in GOROOT

初始化multi-module workspaces 多工作区

cd ..
go work init common

继续往工作区里面添加工作区项目

go work use myproject_1

结束

go work sync
go run myproject_1/main.go

multi-module workspaces https://go.dev/doc/tutorial/workspaces
Get familiar with workspaces https://go.dev/blog/get-familiar-with-workspaces
golang - 多模块工作区 https://www.jianshu.com/p/74e22177e114
Golang 1.18新特性工作区workspace https://blog.csdn.net/qq_39280718/article/details/126786485
未经允许不得转载:沙滩星空的博客 » Golang之workspace工作区模式

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址