Go 1.18 新增三大功能之一“工作區(qū)模式”介紹
?1.介紹
Go 官方在 Go v1.11 新增 Go Modules 模式,并一直持續(xù)到 Go v1.16,每個版本的 Go Modules 模式都會有一些變化。但是,我們的項目使用 Go Modules 模式時,仍然會遇到一些問題。
直到 Go v1.18 版本新增 Workspaces 模式,解決了 Go Modules 模式的這些問題,本文我們介紹 Workspaces 模式的使用方式。
2.引言
當在項目中需要導(dǎo)入一些私有 Git 倉庫或未發(fā)布到 Git 倉庫的依賴項時,或需要修改三方依賴模塊的代碼時,一般解決方法是將代碼下載到本地,在 go.mod? 文件中使用 Go Modules 模式中的 replace 指令替換為本地目錄路徑。
因為 go.mod? 文件也是和項目一起提交到 Git 倉庫,每個開發(fā)人員的本地目錄路徑可能不一樣,所以,就需要把在遠程倉庫拉取到的 go.mod? 文件中 replace 的目錄路徑手動替換為自己的本地目錄路徑之后,才可以正常使用。
3.使用方式
在介紹 Workspaces 模式的使用方式之前,我們需要先使用 Go Modules 模式創(chuàng)建一個 Go 項目,并且我們的 Go 項目依賴模塊 golang.org/x/example。
創(chuàng)建 Go 項目
示例代碼:
輸出結(jié)果:
閱讀上面這段內(nèi)容,是我們已經(jīng)非常熟悉的使用 Go Modules 模式創(chuàng)建 Go 項目的操作步驟,接下來,我們介紹 Workspaces 模式的使用方式。
創(chuàng)建工作區(qū)
執(zhí)行完以上命令,我們可以發(fā)現(xiàn)在 workspace 目錄下創(chuàng)建了一個 go.work? 文件,查看該文件,我們可以發(fā)現(xiàn)包含兩個指令,分別是 go? 和 use。
其中 go? 指令,是指定使用 Go 的哪個版本編譯項目,類似 go.mod? 文件中的 go 指令。
其中 use? 指令,是指在構(gòu)建項目時,hello 目錄中的模塊是主模塊。
在創(chuàng)建工作區(qū)后,我們進入工作區(qū)目錄,運行 main.go 文件。
輸出結(jié)果:
但是,如果我們進入 Home? 目錄(工作區(qū)外),運行 main.go 文件。
輸出結(jié)果:
我們可以在輸出結(jié)果中發(fā)現(xiàn),Go 找不到項目使用的依賴模塊,原因是我們在工作區(qū)外運行 Go 項目,Go 找不到需要的模塊。
4.使用場景
我們在學(xué)會使用 Workspaces 模式后,使用該模式解決 Part 02 提到的問題。
假如我們想要在 Go 項目的依賴模塊 golang.org/x/example? 新增一個函數(shù) ToUpper。
在 Go 未提供 Workspaces 模式時,我們需要下載依賴項到本地,然后修改下載到本地的依賴項文件。
此時,我們就可以修改我們下載到本地的依賴項文件 /Users/frank/workspace/hello/example/stringutil/reverse.go?,新增函數(shù) ToUpper。
然后,我們可以在 main.go 文件中使用該函數(shù)。
輸出結(jié)果:
使用 Go Modules 模式的 replace 指令,雖然可以實現(xiàn)我們的需求,但是,當該項目代碼在其他人電腦上運行時,必須先手動修改為自己的目錄路徑,才可以正常運行。
使用 Workspaces 模式
我們使用 Go 1.18 提供的 Workspaces 模式,實現(xiàn)我們的需求。
將下載到本地的依賴模塊 example 添加到工作區(qū):
我們使用 go work use? 命令將 example? 模塊添加到工作區(qū),我們就可以使用我們下載到本地的依賴模塊 example? 的代碼,而不再使用 GOMODCACHE? 中的 example 模塊的代碼。
我們項目組成員只需維護自己本地的工作區(qū),不必再手動修改 go.mod? 文件中 replace 指令中的本地目錄路徑。
5.總結(jié)
本文我們先敘述使用 Go Modules 模式面臨的一些問題,然后介紹 Go v1.18 新增的 Workspaces 模式的使用方式,最后通過示例介紹使用 Workspaces 模式可以解決使用 Go Modules 模式中的問題。
需要注意的是,go.work? 文件不要推送到遠程倉庫,我們可以將其添加到 .gitignore 文件中。
我們在文中使用到的命令是 go work init? 和 go work use?,此外,還有其他命令,感興趣的讀者朋友們可以執(zhí)行命令 go help work 了解更多。