共计 1327 个字符,预计需要花费 4 分钟才能阅读完成。
在 Go 1.18 引入的多模块工作区(Workspace)功能使我们可以在一个工作区中同时使用多个模块,这对开发大型项目或需要同时处理多个模块依赖的项目非常有帮助。
下面是一个简单使用多模块工作区的案例:
- 创建主目录
首先创建主目录:
mkdir myworkspace
cd myworkspace
- 创建第一个模块
在 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!")
}
- 创建第二个模块
在 myworkspace
文件夹下运行命令:
mkdir mod2
cd mod2
go mod init example.com/mod2
在 mod2
下新建 main.go
文件:
package main
import "example.com/mod1"
func main() {
mod1.Hello()
}
- 创建
go.work
文件
可以使用 go work
命令来创建一个工作区文件 go.work
,将多个模块纳入同一工作区中。在 myworkspace
目录下执行以下命令:
# 初始化工作区
go work init ./mod1 ./mod2
此命令会在 myworkspace
目录下生成一个 go.work
文件,内容如下:
go 1.18
use (
./mod1
./mod2
)
这个 go.work
文件指定了工作区包含的模块目录 mod1
和 mod2
。
- 运行代码
在 myworkspace/mod2
目录下执行如下命令:
go run main.go
- 引用并修改第三方库
在 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