新聞中心
?1.介紹
Go 官方在 Go v1.11 新增 Go Modules 模式,并一直持續(xù)到 Go v1.16,每個(gè)版本的 Go Modules 模式都會(huì)有一些變化。但是,我們的項(xiàng)目使用 Go Modules 模式時(shí),仍然會(huì)遇到一些問題。

直到 Go v1.18 版本新增 Workspaces 模式,解決了 Go Modules 模式的這些問題,本文我們介紹 Workspaces 模式的使用方式。
2.引言
當(dāng)在項(xiàng)目中需要導(dǎo)入一些私有 Git 倉庫或未發(fā)布到 Git 倉庫的依賴項(xiàng)時(shí),或需要修改三方依賴模塊的代碼時(shí),一般解決方法是將代碼下載到本地,在 go.mod? 文件中使用 Go Modules 模式中的 replace 指令替換為本地目錄路徑。
因?yàn)?nbsp;go.mod? 文件也是和項(xiàng)目一起提交到 Git 倉庫,每個(gè)開發(fā)人員的本地目錄路徑可能不一樣,所以,就需要把在遠(yuǎn)程倉庫拉取到的 go.mod? 文件中 replace 的目錄路徑手動(dòng)替換為自己的本地目錄路徑之后,才可以正常使用。
3.使用方式
在介紹 Workspaces 模式的使用方式之前,我們需要先使用 Go Modules 模式創(chuàng)建一個(gè) Go 項(xiàng)目,并且我們的 Go 項(xiàng)目依賴模塊 golang.org/x/example。
創(chuàng)建 Go 項(xiàng)目
# 進(jìn)入 Home 目錄
cd ~
# 創(chuàng)建工作區(qū)目錄
mkdir workspace
# 進(jìn)入工作區(qū)目錄
cd workspace
# 創(chuàng)建 Go 項(xiàng)目所在的目錄
mkdir hello
# 進(jìn)入 Go 項(xiàng)目所在的目錄
cd hello
# 初始化
go mod init github.com/weirubo/hello
# 添加依賴項(xiàng)
go get golang.org/x/example
# 創(chuàng)建 main.go 文件
touch main.go
示例代碼:
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
str := "hello"
reverseStr := stringutil.Reverse(str)
fmt.Println(reverseStr)
}
輸出結(jié)果:
go run main.go
olleh
閱讀上面這段內(nèi)容,是我們已經(jīng)非常熟悉的使用 Go Modules 模式創(chuàng)建 Go 項(xiàng)目的操作步驟,接下來,我們介紹 Workspaces 模式的使用方式。
創(chuàng)建工作區(qū)
# 進(jìn)入 Home 目錄下的 workspace 目錄
cd ~/workspace
# 初始化工作區(qū)
go work init ./hello
執(zhí)行完以上命令,我們可以發(fā)現(xiàn)在 workspace 目錄下創(chuàng)建了一個(gè) go.work? 文件,查看該文件,我們可以發(fā)現(xiàn)包含兩個(gè)指令,分別是 go? 和 use。
go 1.19
use ./hello
其中 go? 指令,是指定使用 Go 的哪個(gè)版本編譯項(xiàng)目,類似 go.mod? 文件中的 go 指令。
其中 use? 指令,是指在構(gòu)建項(xiàng)目時(shí),hello 目錄中的模塊是主模塊。
在創(chuàng)建工作區(qū)后,我們進(jìn)入工作區(qū)目錄,運(yùn)行 main.go 文件。
cd ~/workspace
go run hello/main.go
輸出結(jié)果:
olleh
但是,如果我們進(jìn)入 Home? 目錄(工作區(qū)外),運(yùn)行 main.go 文件。
cd ~
go run workspace/hello/main.go
輸出結(jié)果:
workspace/hello/main.go:5:2: no required module provides package golang.org/x/example/stringutil: go.mod file not found in current directory or any parent directory; see 'go help modules'
我們可以在輸出結(jié)果中發(fā)現(xiàn),Go 找不到項(xiàng)目使用的依賴模塊,原因是我們?cè)诠ぷ鲄^(qū)外運(yùn)行 Go 項(xiàng)目,Go 找不到需要的模塊。
4.使用場(chǎng)景
我們?cè)趯W(xué)會(huì)使用 Workspaces 模式后,使用該模式解決 Part 02 提到的問題。
假如我們想要在 Go 項(xiàng)目的依賴模塊 golang.org/x/example? 新增一個(gè)函數(shù) ToUpper。
在 Go 未提供 Workspaces 模式時(shí),我們需要下載依賴項(xiàng)到本地,然后修改下載到本地的依賴項(xiàng)文件。
cd ~/workspace/hello
git clone https://go.googlesource.com/example
# 編輯 go.mod
go mod edit -replace golang.org/x/example@v0.0.0-20220412213650-2e68773dfca0=/Users/frank/workspace/hello/example
此時(shí),我們就可以修改我們下載到本地的依賴項(xiàng)文件 /Users/frank/workspace/hello/example/stringutil/reverse.go?,新增函數(shù) ToUpper。
func ToUpper(s string) string {
r := []rune(s)
for i := range r {
r[i] = unicode.ToUpper(r[i])
}
return string(r)
}然后,我們可以在 main.go 文件中使用該函數(shù)。
...
toUpperStr := stringutil.ToUpper(str)
fmt.Println(toUpperStr)
...
輸出結(jié)果:
cd ~/workspace/hello
go run main.go
HELLO
使用 Go Modules 模式的 replace 指令,雖然可以實(shí)現(xiàn)我們的需求,但是,當(dāng)該項(xiàng)目代碼在其他人電腦上運(yùn)行時(shí),必須先手動(dòng)修改為自己的目錄路徑,才可以正常運(yùn)行。
使用 Workspaces 模式
我們使用 Go 1.18 提供的 Workspaces 模式,實(shí)現(xiàn)我們的需求。
將下載到本地的依賴模塊 example 添加到工作區(qū):
cd ~/workspace
go work use ./hello/example
我們使用 go work use? 命令將 example? 模塊添加到工作區(qū),我們就可以使用我們下載到本地的依賴模塊 example? 的代碼,而不再使用 GOMODCACHE? 中的 example 模塊的代碼。
我們項(xiàng)目組成員只需維護(hù)自己本地的工作區(qū),不必再手動(dòng)修改 go.mod? 文件中 replace 指令中的本地目錄路徑。
5.總結(jié)
本文我們先敘述使用 Go Modules 模式面臨的一些問題,然后介紹 Go v1.18 新增的 Workspaces 模式的使用方式,最后通過示例介紹使用 Workspaces 模式可以解決使用 Go Modules 模式中的問題。
需要注意的是,go.work? 文件不要推送到遠(yuǎn)程倉庫,我們可以將其添加到 .gitignore 文件中。
我們?cè)谖闹惺褂玫降拿钍?nbsp;go work init? 和 go work use?,此外,還有其他命令,感興趣的讀者朋友們可以執(zhí)行命令 go help work 了解更多。
分享名稱:Go 1.18 新增三大功能之一“工作區(qū)模式”介紹
當(dāng)前路徑:http://www.dlmjj.cn/article/djosspp.html


咨詢
建站咨詢
