go get 與 go mod 的差異與關係
在 Go 的套件管理演進中,go get 和 go mod 扮演不同的角色:
go get:負責下載並取得依賴原始碼。go mod:負責管理專案依賴與版本。
在現代 Go(Modules 模式)下,兩者是搭配使用的:go get 幫你把套件抓回來,go mod 則負責把版本與依賴關係記錄好。
1. go get:下載與安裝依賴(Getter)
在 Go Modules 出現之前(GOPATH 時代),go get 是主要的依賴獲取工具。
-
功能
- 從遠端倉庫(如 GitHub)下載套件原始碼。
- 下載後安裝到本地環境,可執行檔會安裝到
$GOPATH/bin。
-
存放位置(舊模式)
- 套件原始碼:
$GOPATH/src - 可執行檔:
$GOPATH/bin
- 套件原始碼:
-
限制與問題
- 缺乏版本控制:預設抓取遠端最新版本(HEAD),無法精準鎖定版本。
- 更新風險高:上游若出現破壞性更新,很難回滾,容易進入「依賴地獄」。
- 適用情境:學習、快速試驗、臨時工具較合適,不適合作為正式專案的依賴管理方案。
2. go mod:模組與版本管理(Manager)
go mod 自 Go 1.11 引入,後續成為官方標準,用來解決傳統 go get 的版本管理問題。
-
核心功能
- 管理專案的
go.mod、go.sum檔案。 - 明確記錄「專案依賴哪些套件」「各自的版本」。
- 管理專案的
-
特性
- 脫離 GOPATH 限制:專案可以放在任意目錄,不再強制位於
$GOPATH/src。 - 版本管理
- 採用語義化版本(Semantic Versioning)。
- 透過
go.mod/go.sum確保可重現構建(Reproducible Builds)。
- 取代舊工具:逐步取代早期實驗性工具(如
dep)。
- 脫離 GOPATH 限制:專案可以放在任意目錄,不再強制位於
3. go get 與 go mod 的比較
| 特性 | go get(傳統模式) | go mod(現代模式) |
|---|---|---|
| 主要動作 | 下載、安裝套件 | 管理依賴關係與版本 |
| 依賴存放地 | $GOPATH/src(全域共享) | $GOPATH/pkg/mod(快取)+ 專案內引用 |
| 版本策略 | 預設抓最新版 HEAD,難以鎖定版本 | 依 go.mod / go.sum 嚴格鎖定版本 |
| 適用場景 | 快速安裝工具、簡單測試 | 正式專案開發、團隊協作 |
4. 在 Modules 模式下實際怎麼用?
在現代 Go(啟用 Modules)中,go get 依然會被使用,但角色略有改變:
-
指令示例:
go get github.com/gin-gonic/gin -
實際流程:
- 表面上:
go get負責「下載依賴」。 - 背後:
go mod會:- 解析套件版本;
- 更新
go.mod、go.sum; - 將對應版本記錄下來,確保之後編譯行為一致。
- 表面上:
可以這樣總結:
go get:幫你把套件抓回來。go mod:幫你把「抓回來的東西」記錄好、版本鎖好,讓專案可以穩定重現。