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