---
theme: cyanosis
---
上次的筆記在 GoModule 上花了很久。依然對其半知不解。這是因為對其歷史不清楚導致的:
其實 GoModule 並不是什么老概念,而是比較新版本的 go 才推出的。在此之前 go 是通過 GoPath 來管理包。
# 1. GoPath 的坑
當使用 `go get <package>` 時,GoPath 會在 GOPATH 路徑(一個環境變量)上安裝第三方包。
並且在 Go 里,你的代碼必須放在 GOPATH 里才能運行。
那么這里就會有兩種選擇:
1. 不同項目使用不同的 $GOPATH:這個優點很明顯,就像 javascript 里的 node_modules 一樣,不同項目自有一套自己的依賴。缺點也很明顯,一是重復下載相同的依賴,占用空間大;二是 GoPath 非常垃圾,你下載的第三方包會直接下到你的 src 文件夾里,就是說和你自己寫的代碼放在一起,導致目錄結構極其混亂,意義不明。
2. 不同項目使用同一個 $GOPATH:解決了重復依賴占用空間的問題,但是項目結構就會極其極其混亂,不僅不同項目文件混在一起,而且還和第三方包混在一起。
# 2. GoModule
令人震驚的是,Go 居然直到 1.11 版本才解決這個問題,真有你的,Go。
解決方案就是 GoModule。
GoModule 解決的問題非常簡單,就是在 GoPath 之外再弄一個 GoModule 目錄(就是 `go mod init` 的那個目錄),這樣自己的代碼安裝在 GoModule 目錄里,第三方則安裝在 GoPath 目錄里。雖然我不知道為什么這種東西還要等 1.11 版本才能出來,但這就是 GO。
GoModule 的優勢:
1. 如上面所說,自己的代碼和第三方包分成了兩個路徑,項目結構的問題解決了。
2. 這樣就可以只設置一個 GoPath,所有項目共用這一個 GoPath,依賴重復的問題也解決了。
3. GoModule 終於有了依賴管理,終於有了版本管理,版本沖突問題也得到了控制。(但是看網上一些帖子說還是很垃圾,這個等我遇到了再提)
在 GoPath 時代,代碼只能在 GoPath 上運行,而有了 GoModule 之后,就可以在 GoModule 目錄上運行代碼。而 GoPath 只是作為一個倉庫存放第三方包了。
# 3. vscode 上 go 插件的坑
令人震驚,vscode 上的 go 插件也有坑。那就是不支持多個 module 管理。如果有多個 module 在同一個目錄下,想要讓 vscode 對依賴導入等正常工作,就不能在這個目錄下,只能進入單獨的 module 開多個。
- 然后我看了看 vscode 上 go 插件的開發者,嗯,是 go team at google,不愧是你,go。
不過官方說之后的版本會支持,等吧。