新聞中心
Go 的依賴管理,也就是 Go Module。從推出到現(xiàn)在,也已經(jīng)有了一定的年頭了,吐槽一直很多,官方也不斷地在進行完善。

Go1.18 將會推出一個新特性:Multi-Module Workspaces,用于支持 Module 多工作區(qū),能解決以往的一系列問題。
今天將由煎魚帶大家一起深入學習。
背景
在日常使用 Go 工程時,總會遇到 2 個經(jīng)典問題,特別的折騰人。
如下:
- 依賴本地 replace module。
- 依賴本地未發(fā)布的 module。
replace module
第一個場景:像是平時在 Go 工程中,我們?yōu)榱私鉀Q一些本地依賴,或是定制化代碼。會在 go.mod 文件中使用 replace 做替換。
如下代碼:
replace golang.org/x/net => /Users/eddycjy/go/awesomeProject
這樣就可以實現(xiàn)本地開發(fā)聯(lián)調時的準確性。
問題就在這里:
- 本地路徑:所設定的 replace 本質上轉換的是本地的路徑,也就是每個人都不一樣。
- 倉庫依賴:文件修改是會上傳到 Git 倉庫的,不小心傳上去了,影響到其他開發(fā)同學,又或是每次上傳都得重新改回去。
用戶體驗非常差,很折騰人。
未發(fā)布的 module
第二個場景:在做本地的 Go 項目開發(fā)時,可能會在本地同時開發(fā)多個庫(項目庫、工具庫、第三方庫)等。
如下代碼:
package main
import (
"github.com/eddycjy/pkgutil"
)
func main() {
pkgutil.PrintFish()
}
如果這個時候運行 go run 或是 go mod tidy,都不行,會運行失敗。
報如下類似錯誤:
fatal: repository 'https://github.com/eddycjy/pkgutil/' not found
這個問題報錯是因為 github.com/eddycjy/pkgutil這個庫,在 GitHub 是沒有的,自然也就拉取不到。
解決方法:在 Go1.18 以前,我們會通過 replace(會遇到背景一的問題),又或是直接上傳到 Github 上,自然也就能被 Go 工具鏈拉取到依賴了。
許多同學會發(fā)出靈魂質疑:Go 的依賴都必須要上傳到 GitHub 嗎,強綁定?
對新入門的同學非常不友好,很要命。
工作區(qū)模式
在社區(qū)的多輪反饋下,Michael Matloob 提出了提案《Proposal: Multi-Module Workspaces in cmd/go[1]》進行了大量的討論和實施,在 Go1.18 正式落地。
新提案的一個核心概念,就是增加了 go work 工作區(qū)的概念,針對的是 Go Module 的依賴管理模式。
其能夠在本地項目的 go.work 文件中,通過設置一系列依賴的模塊本地路徑,再將路徑下的模塊組成一個當前 Go 工程的工作區(qū),也就是 N 個 Go Module 組成 1 個 Go Work, 工作區(qū)的讀取優(yōu)先級是最高的。
我們可以通過 go help 來查看,如下:
$ go1.18beta1 help work
Usage:
go work[arguments]
The commands are:
edit edit go.work from tools or scripts
init initialize workspace file
sync sync workspace build list to modules
use add modules to workspace file
Use "go help work" for more information about a command.
只要執(zhí)行 go work init 就可以初始化一個新的工作區(qū),后面跟的參數(shù)就是要生成的具體子模塊 mod。
命令如下:
go work init ./mod ./tools
項目目錄如下:
項目目錄如下:
awesomeProject
├── mod
│ ├── go.mod // 子模塊
│ └── main.go
├── go.work // 工作區(qū)
└── tools
├── fish.go
└── go.mod // 子模塊
生成的 go.work 文件內容:
go 1.18
use (
./mod
./tools
)
新的 go.work 與 go.mod 語法一致,也可以使用 replace 語法:
go 1.18
use (...)
replace golang.org/x/net => example.com/fork/net v1.4.5
- go.work 文件內共支持三個指令:
- go:聲明 go 版本號,主要用于后續(xù)新語義的版本控制。
- use:聲明應用所依賴模塊的具體文件路徑,路徑可以是絕對路徑或相對路徑,可以在應用命目錄外均可。
replace:聲明替換某個模塊依賴的導入路徑,優(yōu)先級高級 go.mod 中的 replace 指令。
若想要禁用工作區(qū)模式,可以通過 -workfile=off指令來指定。
也就是在運行時執(zhí)行如下命令:
go run -workfile=off main.go
go build -workfile=off
go.work 文件是不需要提交到 Git 倉庫上的,否則就比較折騰了。
只要你在 Go 項目中設置了 go.work 文件,那么在運行和編譯時就會進入到工作區(qū)模式,會優(yōu)先以工作區(qū)的配置為最高優(yōu)先級,來適配本地開發(fā)的訴求。
至此,工作區(qū)的核心知識就介紹完畢了。
總結
今天給大家介紹了 Go1.18 的新特性:多 Module 工作區(qū)模式。其本質上還是為了解決本地開發(fā)的訴求。
由于 go.mod 文件是與項目強關聯(lián)的,基本都會上傳到 Git 倉庫中,很難在這上面動刀子。直接就造了個 go.work 出來,純本地使用,方便快捷。
使用新的 go.work,就可以在完全是本地文件上各種搗鼓了,不會對其他成員開發(fā)有其他影響。
你覺得怎么樣呢?:)
參考資料
[1]Proposal: Multi-Module Workspaces in cmd/go: https://go.googlesource.com/proposal/+/master/design/45713-workspace.md
網(wǎng)頁題目:Go1.18 新特性:多 Module 工作區(qū)模式
分享網(wǎng)址:http://www.dlmjj.cn/article/cojppcc.html


咨詢
建站咨詢
