Go 语言多模块工作区


共计 1327 个字符,预计需要花费 4 分钟才能阅读完成。

在 Go 1.18 引入的多模块工作区(Workspace)功能使我们可以在一个工作区中同时使用多个模块,这对开发大型项目或需要同时处理多个模块依赖的项目非常有帮助。

下面是一个简单使用多模块工作区的案例:

  1. 创建主目录

首先创建主目录:

mkdir myworkspace
cd myworkspace
  1. 创建第一个模块

myworkspace 文件夹下运行命令:

mkdir mod1
cd mod1
go mod init example.com/mod1

mod1 下新建 hello.go文件:

package mod1

import "fmt"

func Hello() {
    fmt.Println("Hello from mod1!")
}
  1. 创建第二个模块

myworkspace 文件夹下运行命令:

mkdir mod2
cd mod2
go mod init example.com/mod2

mod2 下新建 main.go文件:

package main

import "example.com/mod1"

func main() {
    mod1.Hello()
}
  1. 创建go.work文件

可以使用 go work 命令来创建一个工作区文件 go.work,将多个模块纳入同一工作区中。在 myworkspace 目录下执行以下命令:

# 初始化工作区
go work init ./mod1 ./mod2

此命令会在 myworkspace 目录下生成一个 go.work 文件,内容如下:

go 1.18

use (
    ./mod1
    ./mod2
)

这个 go.work 文件指定了工作区包含的模块目录 mod1mod2

  1. 运行代码

myworkspace/mod2 目录下执行如下命令:

go run main.go
  1. 引用并修改第三方库

myworkspace 下执行如下命令:

git clone https://go.googlesource.com/example

这里是将第三方的代码下载到本地,通过 go work 将其添加到工作区:

go work use ./example/hello

这里不使用 go work use ./example 的原因是 go work use 命令要求提供的是 Go 模块的根目录,myworkspace/example/hello 是一个 Go 模块的根目录(它包含自己的 go.mod 文件),所以它是一个独立的模块,即使 myworkspace/example 也有 go.mod 文件,它也不再属于上层模块的范围。

myworkspace/example/hello/reverse 目录下创建 int.go 文件:

package reverse

import "strconv"

// Int 返回整数的十进制反转值。
func Int(i int) int {
    i, _ = strconv.Atoi(String(strconv.Itoa(i)))
    return i
}

修改 myworkspace/mod2/main.go 文件:

package main

import (
    "fmt"
    "golang.org/x/example/hello/reverse"
)

func main() {
    fmt.Println(reverse.String("Hello"), reverse.Int(24601))
}

myworkspace/mod2 下运行如下命令:

go run main.go

Tips:清朝云网络工作室

阅读剩余
THE END