go module 使用

1、介紹

go從 v1.11 以後就推出了新的包管理,go module,它和以前的$GOPATH不一樣,已經不在須要src,bin這樣的子目錄了,一個源代碼目錄甚至是空目錄均可以做爲module,只要其中包含有go.mod文件。 git

module 是一個相關Go包的集合,它是源代碼更替和版本控制的單元。模塊由源文件造成的go.mod文件的根目錄定義,包含 go.mod 文件的目錄也被稱爲模塊根。moudles取代舊的的基於GOPATH方法來指定在工程中使用哪些源文件或導入包。模塊路徑是導入包的路徑前綴, go.mod 文件定義模塊路徑,而且列出了在項目構建過程當中使用的特定版本。 github

go1.11.1 golang

g o . mod 文件

  • go.mod 文件 定義 module 路徑以及列出其餘須要 在 build 時引入的模塊的特定的 版本 ,以下 。 緩存

    module gomodule_demo 
    go 1.14 
    require ( 
    github.com/sirupsen/logrus v1.6.0 
    github.com/stretchr/testify v1.4.0 // indirect 
    golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect 
    gopkg.in/yaml.v2 v2.2.8 // indirect 
    )
  • module:用於定義當前項目的模塊路徑。 ide

  • go:用於標識當前模塊的 Go 語言版本,值爲初始化模塊時的版本,目前來看還只是個標識做用。 ui

  • require:用於設置一個特定的模塊版本。 命令行

  • exclude:用於從使用中排除一個特定的模塊版本。 版本控制

  • replace:用於將一個模塊版本替換爲另一個模塊版本。 code

    go.sum文件

  • 構建狀態跟蹤文件。它會記錄當前module全部的頂層和間接依賴,以及這些依賴的校驗和
  • 保留過去使用的包的版本信息,以便往後可能的版本回退
  • 必須提交到git代碼倉庫
    github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 
    github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 
    github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 
    ........

    環境變量——GO111MODULE

Go 1.11中module 支持臨時環境變量—— GO111MODULE ,它能夠設置如下三個值: off , on 或者 auto (默認)。 blog

  • 若是 GO111MODULE=off ,那麼 go 命令行將不會使用新的 module 功能,相反的,它將會在 vendor 目錄下和 GOPATH 目錄中查找依賴包。也把這種模式叫 GOPATH模式
  • 若是 GO111MODULE=on ,那麼 go 命令行就會使用 modules 功能,而不會訪問 GOPATH 。也把這種模式稱做 module-aware 模式,這種模式下, GOPATH 再也不在 build 時扮演導入的角色,可是儘管如此,它仍是承擔着存儲下載依賴包的角色。它會將依賴包放在 GOPATH/pkg/mod 目錄下。
  • 若是 GO111MODULE=auto ,這種模式是默認的模式,也就是說在你不設置的狀況下,就是 auto 。這種狀況下, go 命令行會根據當前目錄來決定是否啓用 module 功能。只有噹噹前目錄在 GOPATH/src 目錄以外並且當前目錄包含 go.mod 文件或者其子目錄包含 go.mod 文件纔會啓用。

2、go mod 相關命令

go mod init 生成 go.mod 文件 (Go 1.13 中惟一一個能夠生成 go.mod 文件的子命令)

go mod tidy -v 整理現有的依賴,刪除未使用的依賴。

go mod vendor 導出現有的全部依賴 (事實上 Go modules 正在淡化 Vendor 的概念)

接下來使用go build -mod=vendor來構建項目, 由於在go modules模式下go build是屏蔽vendor機制的,因此須要特定參數從新開啓vendor機制:
go mod graph 查看現有的依賴結構

go mod download 下載 go.mod 文件中指明的全部依賴

go mod edit 編輯 go.mod 文件

go mod verify 校驗一個模塊是否被篡改過

go clean -modcache 清理全部已緩存的模塊版本數據。

go mod 查看全部 go mod的使用命令。

3、版本號

go module 使用

其版本格式爲 「主版本號.次版本號.修訂號」,版本號的遞增規則以下:

  • 主版本號:當你作了不兼容的 API 修改。

  • 次版本號:當你作了向下兼容的功能性新增。

  • 修訂號:當你作了向下兼容的問題修正。

go module 使用

4、實操

  • 建立一個demo目錄
  • 初始化go module,生成go.mod和go.sum
  • replace替換本地包
  • 生成vendor包,使用 go build -mod=vendor

5、 總結

  1. Go modules 發佈於 Go1.11,成長於 Go1.12,豐富於 Go1.13,正式於 Go1.14 推薦在生產上使用,它 出現的目的之一就是爲了解決 GOPATH 的問題,也就至關因而拋棄 GOPATH 了。
  2. 通常狀況, go mod initgo mod tidy -v 兩個命令就夠用了。
  3. 建議 export GOPROXY= https://goproxy.io下載比較快。
相關文章
相關標籤/搜索