go modules

greedyco發表於2020-06-11

go modules

宣告

本文部分內容引用了@JaguarJack的《Go Modules 詳解使用》

go modules是Golang 1.11增加新特性,是Golang自帶的依賴管理工具。在Golang v1.11和v1.12版本中,go modules預設是沒有開啟的,需要設定環境變數GO111MODULE,從v1.13版本開始,go module預設開啟。

GO111MODULE

如果你的Golang版本是v1.11和v1.12,需要通過設定環境變數GO111MODULE來開啟go modules功能。

GO111MODULE有3個值off、on、auto:

  • GO111MODULE=off:關閉go modules功能,在編譯的時候仍舊在$GOPATH/src或者vendor目錄中尋找依賴
  • GO111MODULE=on:開啟go modules功能,在編譯時不會在$GOPATH/src或者vendor目錄中尋找依賴。此時,開發者可以將專案目錄建立在$GOPATH/src目錄之外任意位置,且專案根目錄生成go.mod檔案。同時,依賴包不再存放在$GOPATH/src目錄,而是存放在$GOPATH/pkg/mod目錄,多個專案可以共享快取的modules。
  • GO111MODULE=auto:Golang v1.13的預設值,如果專案不在$GOPATH/src目錄,且專案根目錄有go.mod檔案,則開啟go modules功能

設定GO111MODULE

如果你的Golang版本是v1.13及以上 (goproxy官方推薦)

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

如果你的Golang版本是v1.11和v1.12
(1) Linux系統
/etc/profile檔案新增如下命令,然後執行source /etc/profile使配置檔案生效。

export GO111MODULE=on
export GOPROXY=https://goproxy.io

(2) Windows環境
使用Powershell執行如下命令:

$env:GO111MODULE="on"
$env:GOPROXY="https://goproxy.io"

go mod

Golang提供了一系列go mod相關命令用來管理依賴,命令列表如下:

命令 說明
init 在當前目錄初始化module,生成go.mod檔案
download 下載go.mod檔案中指定的依賴
edit 編輯go.mod檔案
tidy 下載缺少的依賴,刪除無用的依賴
vendor 在專案中建立vendor目錄,然後將依賴包複製到vendor目錄
graph 顯示各個依賴包之間的關係圖
verify 驗證依賴是否正確
why 解釋為什麼需要依賴

go mod init
在任意位置建立目錄,使用go mod init命令來初始化module,在當前目錄生成go.mod檔案。

cd ~ & mkdir -p gomod/demo
cd gomod/demo
go mod init demo

生成完go.mod檔案後,其檔案內容會被go toolchain掌控,當執行go buildgo rungo testgo get等命令時都會對go.mod檔案進行維護。

go mod edit
現在在demo專案中新建main.go檔案,嘗試在demo中使用gin框架。
首先,下載gin框架:

go get -u github.com/gin-gonic/gin

然後,在main.go檔案中使用gin框架,下面的示例來自gin框架文件:

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() // 監聽並在 0.0.0.0:8080 上啟動服務
}

執行go run main.go 命令,此時go.mod檔案內容如下:

module learngin

go 1.13

require github.com/gin-gonic/gin v1.6.3 // indirect

從go.mod檔案可以看出,引入的gin框架版本是v1.6.3,接下來可以使用go mod edit命令自由的切換不同版本的依賴。
首先,檢視gin框架的歷史版本:

go list -m -versions github.com/gin-gonic/gin 

列出如下歷史版本:
go modules
然後,將gin框架更新至指定的版本:

// 修改go.mod檔案
go mod edit -require="github.com/gin-gonic/gin@v1.6.2"
// 下載缺少的依賴,刪除無用的依賴
go mod tidy

除此之外,還可以使用go get來更新依賴版本:

// 在依賴後面加上@version指定版本號
go get github.com/gin-gonic/gin@v1.6.2

go mod tidy
使用go mod tidy命令會自動刪除專案中不需要的依賴,同時下載缺少的依賴。

總結

本文首先是簡單的介紹了Golang v1.11增加的一個新特性go modules;然後介紹瞭如何開啟go modules功能以及配置代理;最後是介紹了幾個常用go mod命令。

生命不息,學習不止

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

相關文章