方便同时进行多个仓库/模块并行开发调试
go.mod replace
指令来实现,如果你正巧是同时进行多个模块的开发,使用它可能是很痛苦的。每次当你想要提交代码的时候,都不得不删除掉 go.mod 中的 replace
才能使模块稳定的发布版本。# 查看 go 版本
> go version
go version go1.18 darwin/amd64
go work
支持命令$GOPATH
路径下执行,生成 go.work 文件go work init
初始化工作区文件,用于生成 go.work 工作区文件初始化并写入一个新的 go.work 到当前路径下,可以指定需要添加的代码模块 示例:
go work init ./hello
将本地仓库 hello 添加到工作区undefinedhello 仓库必须是 go mod 依赖管理的仓库(./hello/go.mod 文件必须存在)
go work use
添加新的模块到工作区命令示例:
go work use ./example
添加一个模块到工作区undefinedgo work use ./example ./example1
添加多个模块到工作区undefinedgo work use -r ./example
递归 ./example 目录到当前工作区undefined删除命令使用go work edit -dropuse=./example
功能
go work edit
用于编辑 go.work 文件可以使用 edit
命令编辑和手动编辑 go.work
文件效果是相同的示例:undefined
go work edit -fmt go.work
重新格式化 go.work 文件undefinedgo work edit -replace=github.com/link1st/example=./example go.work
替换代码模块undefinedgo work edit -dropreplace=github.com/link1st/example
删除替换代码模块undefinedgo work edit -use=./example go.work
添加新的模块到工作区undefinedgo work edit -dropuse=./example go.work
从工作区中删除模块
go work sync
将工作区的构建列表同步到工作区的模块go env GOWORK
查看环境变量,查看当前工作区文件路径可以排查工作区文件是否设置正确,go.work 路径找不到可以使用 GOWORK 指定
> go env GOWORK
$GOPATH/src/link1st/link1st/workspaces/go.work
go 1.18
use (
./hello
./example
)
replace (
github.com/link1st/example => ./example1
)
use
指定使用的模块目录go work use hello
添加模块,也可以手动修改 go.work 工作区添加新的模块replaces
功能类似。# 单模块结构
use ./hello
# 多模块结构
use (
./hello
./example
)
replaces
替换依赖仓库地址replaces
命令与 go.mod 指令相同,用于替换项目中依赖的仓库地址replaces
和 use
不能同时指定相同的本地路径 同时指定报错信息:undefinedgo: workspace module github.com/link1st/example is replaced at all versions in the go.work file. To fix, remove the replacement from the go.work file or specify the version at which to replace the module.
同时在
use
和replace
指定相同的本地路径
go 1.18
use (
./hello
./example
)
replace (
github.com/link1st/example => ./example
)
replace
功能的的时候分别指定不同的代码仓库路径,go.work 优先级高于 go.mod 中定义go.mod 中定义替换为本地仓库 example
replace (
github.com/link1st/example => ./example1
)
go.work 中定义替换为本地仓库 example1
replace (
github.com/link1st/example => ./example1
)
go run
和 go build
都会默认使用工作区功能GOWORK
也可以指定配置 go.work 文件位置export GOWORK="~/go/src/test/go.18/workspace/go.work"
GOWORK
设置 off
则可以禁用工作区功能export GOWORK=off
mkdir hello
cd hello
# 代码仓库启动 go mod 依赖管理,生成 go.mod 文件
go mod init github.com/link1st/link1st/workspaces/hello
# 下载依赖包
go get github.com/link1st/example
# 编写 main 文件
vim main.go
// Package main main 文件,go 多模块工作区演示代码
// 实现将输入的字符串反转输出并输出
package main
import (
"flag"
"fmt"
"github.com/link1st/example/stringutil"
)
var (
str = ""
)
func init() {
flag.StringVar(&str, "str", str, "输入字符")
flag.Parse()
}
func main() {
if str == "" {
fmt.Println("示例: go run main.go -str hello")
fmt.Println("str 参数必填")
flag.Usage()
return
}
// 调用公共仓库,进行字符串反转
str = stringutil.Reversal(str)
// 输出反转后的字符串
fmt.Println(str)
return
}
go run main.go -str "hello world"
或 go run github.com/link1st/link1st/workspaces/hello -str "hello world"
可以看到输出了 hello world 反转以后的字符串> go run main.go -str "hello world"
dlrow olleh
# 回到工作根目录,将 common 代码下载到本地进行添加新的功能
# 下载依赖的 example 包
git clone git@github.com:link1st/example.git
# 在 example 包中添加 字符串大学的功能
// Package stringutil stringutil
package stringutil
import (
"unicode"
)
// ToUpper 将字符串进行大写
func ToUpper(s string) string {
r := []rune(s)
for i := range r {
r[i] = unicode.ToUpper(r[i])
}
return string(r)
}
# 初始化 go.work 文件
go work init ./hello ./example
# 查看 go.work 文件内容
cat go.work
go 1.18
use (
./example
./hello
)
vim main.go
将字符串大写的功能添加上。func main() {
...
// 调用公共仓库,进行字符串反转
str = stringutil.Reversal(str)
// 增加字符大写的功能
str = stringutil.ToUpper(str)
// 输出反转后的字符串
fmt.Println(str)
...
}
go run main.go -str "hello world"
DLROW OLLEH
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。