Go Modules 詳解使用

JaguarJack發表於2019-04-13

原文轉載 Go Modules 詳解使用

Module

自從 Go 官方從去年推出 1.11 之後,增加新的依賴管理模組並且更加易於管理專案中所需要的模組。模組是儲存在檔案樹中的 Go 包的集合,其根目錄中包含 go.mod 檔案。 go.mod 檔案定義了模組的模組路徑,它也是用於根目錄的匯入路徑,以及它的依賴性要求。每個依賴性要求都被寫為模組路徑和特定語義版本。

從 Go 1.11 開始,Go 允許在 $GOPATH/src 外的任何目錄下使用 go.mod 建立專案。在 $GOPATH/src 中,為了相容性,Go 命令仍然在舊的 GOPATH 模式下執行。從 Go 1.13 開始,模組模式將成為預設模式。

本文將介紹使用模組開發 Go 程式碼時出現的一系列常見操作:

  • 建立一個新模組。
  • 新增依賴項。
  • 升級依賴項。
  • 刪除未使用的依賴項。

下面使用的案例都是以 GIN 模組為例。
在這之前呢,需要先設定一些環境變數:

export GO111MODULE=on
export GOPROXY=https://goproxy.io // 設定代理

建立一個新模組

你可以在 $GOPATH/src 之外的任何地方建立一個新的目錄。比如:

mkdir backend && cd backend

然後初始化 go mod init backend,成功之後你會發現目錄下會生成一個 go.mod 檔案.

$ cat go.mod

內容如下

module backend

go 1.12

新增依賴項

建立一個檔案 main.go 然後加入以下程式碼,這裡直接 import 了 gin 的依賴包。

vim main.go

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

go build 之後,會在 go.mod 引入所需要的依賴包。之後再來看看 go.mod 檔案的情況。

module backend

go 1.12

require (
    github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
    github.com/gin-gonic/gin v1.3.0
    github.com/golang/protobuf v1.3.1 // indirect
    github.com/mattn/go-isatty v0.0.7 // indirect
    github.com/ugorji/go v1.1.4 // indirect
    gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
    gopkg.in/yaml.v2 v2.2.2 // indirect

require 就是 gin 框架所需要的所有依賴包 並且在每個依賴包的後面已經表明了版本號

升級依賴項

首先我們需要檢視以下我們使用到的依賴列表

> $ go list -m all
// 你會看到所有專案使用的依賴包
backend
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
github.com/gin-gonic/gin v1.3.0
github.com/golang/protobuf v1.3.1
github.com/mattn/go-isatty v0.0.7
github.com/ugorji/go v1.1.4
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
gopkg.in/go-playground/validator.v8 v8.18.2
gopkg.in/yaml.v2 v2.2.2

因為這裡使用的是最新的版本,無法升級,所以這裡給出一個回退的例子。將 GIN 框架的版本回退到上個版本。這裡需要使用一個命令檢視依賴的版本歷史。

>$ go list -m -versions github.com/gin-gonic/gin
// 將會列出 Gin 版本歷史
github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0

將版本更新到上個版本,這裡只是個演示。

>$ go get github.com/gin-gonic/gin@v1.1.4 // 只需要在依賴後面加上 @version 就可以了
>$ go list -m all
// 看到了版本變化
github.com/gin-gonic/gin v1.1.4

或者可以使用 go mod來進行版本的切換, 這樣就需要兩個步驟了

>$ go mod edit -require="github.com/gin-gonic/gin@v1.1.4" // 修改 go.mod 檔案
>$ go tidy //下載更新依賴

go.tidy 會自動清理掉不需要的依賴項,同時可以將依賴項更新到當前版本

使用起來這是一個很簡單過程,只需要幾個命令,你便可以知道依賴的版本資訊,以及自由選擇安裝的版本,一切都變得這麼簡單。

刪除未使用的依賴項

如果你在專案過程需要移除一些不需要的依賴,可以使用下面的命令來執行:

>$ go mod tidy

更多關於 go mod 的使用命令

>$ go mod
The commands are:

        download    download modules to local cache
        edit        edit go.mod from tools or scripts
        graph       print module requirement graph
        init        initialize new module in current directory
        tidy        add missing and remove unused modules
        vendor      make vendored copy of dependencies
        verify      verify dependencies have expected content
        why         explain why packages or modules are needed

結論

Go Module 是 Go 依賴管理的未來。 目前只有 1.11 和 1.12 版本支援該功能,介紹了 Go 依賴管理的功能。更多的功能會在以後補充。也歡迎補充完善。最後如果你是使用 Goland, 請移步這裡Working with Go Modules
閱讀關於使用 Modules 開發

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章