Golang 多模块工作区示例

492 阅读2分钟

Golang 多模块工作区示例

多模块工作区的作用

可以同时对工作区中的多个模块进行开发和测试; 比如A模块依赖github.com/B模块,但B模块还在本地开发未发布到github,那此时运行go run 会出错;在Go1.18以前,需要用replace或者上传到github来解决; 但在Go1.18及以后,用工作区就可以解决这个问题;

创建与使用工作区

初始化工作区

mkdir workspace
cd workspace

运行go work init 将当前目录初始化为工作区,会生成go.work文件;

此时 go.work 中只有一行

go 1.19

创建模块

cd hello
go mod init example.com/hello
touch hello.go
vim hello.go
go get golang.org/x/example // 添加依赖项

将此模块添加到工作区:go work use . 或在工作区目录执行:go work use ./hello

此时go.work内容:

go 1.19

use ./hello

初始化工作区并添加一个模块,可以使用命令:go work init ./hello

hello.go代码

package main
import (
    "fmt"
    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.Reverse("Hello"))
}

运行:go run example.com/hello

下载golang.org/x/example模块并添加到工作区

cd workspace
git clone https://go.googlesource.com/example
go work use ./example // 添加到工作区

在example模块中添加新功能

在example/stringutil目录下创建新文件 toupper.go

package stringutil
import "unicode"

func ToUpper(s string) string {
    r := []rune(s)
    for i := range r {
        r[i] = unicode.ToUpper(r[i])
    }
    return string(r)
}

在hello模块中调用新功能

注意这时新功能并没有发布到github 修改hello.go代码

package main
import (
    "fmt"
    "golang.org/x/example/stringutil"
)

func main() {
    // 改为调用本地添加的功能
    fmt.Println(stringutil.ToUpper("Hello"))
}

运行go run hello.go可以看到调用成功,这说明在工作区中,无需发布或者替换(replace)也可以进行多模块的开发;

后记

工作区中项目目录

workspace
|__go.work
|__hello
    |__go.mod
    |__hello.go
|__example
    |__stringutil
        |__toupper.go
        |__reverse.go

文中提到的replace用法

在Go1.18之前(或我们不使用go.work),调用本地模块需要将go.mod 文件中的模块改为指向本地,如hello模块中调用golang.org/x/example模块,就要在hello目录下执行: go mod edit -replace golang.org/x/example=../example 此时hello模块的go.mod文件如下:

module example.com/hello

go 1.19

require golang.org/x/example v0.0.0-20220412213650-2e68773dfca0 // indirect

replace golang.org/x/example => ../example

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情