Skip to main content

go getgo mod 的差異與關係

在 Go 的套件管理演進中,go getgo 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.modgo.sum 檔案。
    • 明確記錄「專案依賴哪些套件」「各自的版本」。
  • 特性

    • 脫離 GOPATH 限制:專案可以放在任意目錄,不再強制位於 $GOPATH/src
    • 版本管理
      • 採用語義化版本(Semantic Versioning)。
      • 透過 go.mod / go.sum 確保可重現構建(Reproducible Builds)。
    • 取代舊工具:逐步取代早期實驗性工具(如 dep)。

3. go getgo 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.modgo.sum
      • 將對應版本記錄下來,確保之後編譯行為一致。

可以這樣總結:

  • go get:幫你把套件抓回來。
  • go mod:幫你把「抓回來的東西」記錄好、版本鎖好,讓專案可以穩定重現。