Go 開發常用操作技巧 -- 模塊管理

Go 依賴管理經歷了 3 個階段,GOPATH、Go Vendor、Go Module。

  1. GOPATH

GOPATH 是 Go 語言的一個環境變量,它是 Go 項目的工作區。目錄有 3 個結構:

go get 會下載最新版本的包到 src 目錄下。因爲 src 下只能允許一個版本的存在,所以對於多個項目依賴同一個庫的不同版本這種情況,GOPATH 管理模式就顯得力不從心了。至此,Go Vendor 出現了。

  1. Go Vendor

1.5 版本推出了vendor機制。就是每個項目的根目錄下有一個 vendor 目錄,裏面存放了該項目的依賴包。go build 的時候會先去 vendor 目錄中查找依賴,如果沒有找到再去 GOPATH 目錄下查找。這樣每個項目引入一份依賴的副本,解決了多個項目需要使用同一個 package 依賴的衝突問題。

vendor 機制的缺點是,同一個依賴包如果不同工程想重用,都必須各自複製一份在自己的 vendor 目錄下。不能重用,使得冗餘度上升。

  1. Go Module

從 Go1.11 版本開始,官方推出Go module作爲包管理工具,在 Go 1.16 默認開啓,可以看到在項目目錄下有一個 go.mod 文件,且工程項目可以放在 GOPATH 路徑之外。

go mod 使用

設置的命令如下:

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

可在命令行中輸入:go env 查看 GO111MODULE=on 。

go mod 常用命令:

  1. 創建 module

工程項目可以放在 GOPATH 路徑之外,執行go mod init modulename 命令可以創建一個 go.mod 文件。在項目根目錄建一個 go.mod 文件即可。

go.mod 文件結構

  1. 添加依賴

在 Go1.16 版本之前,運行 go 命令(go run、go build、go test)時,會自動下載並修改 go.mod 文件。
在 Go1.16 版本中,運行 go 命令,如果 import 的依賴再 go.mod 文件中沒有,就不會再自動下載,而會提示錯誤,需要手動執行 go get 命令下載對應的包。因爲自動下載的方式,如果在導入的包沒有提供任何依賴的情況下自動添加新的依賴,有可能會引起公共依賴包的升級等。

  1. go get 更新依賴
  1. go.sum 文件

go.sum 是記錄了所有依賴的 module 的校驗信息,以防下載的依賴被惡意篡改,主要用於安全校驗。格式如下:

<module> <version> <hash>
<module> <version>/go.mod <hash>

module 是依賴的路徑。version 是依賴的版本號。如果 version 後面跟 /go.mod 表示對哈希值是 module 的 go.mod 文件;否則,哈希值是 module 的. zip 文件。

go.mod 和 go.sum 文件都需要被加入版本管理中。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/I1dB48VizF8kHf5ANauH1A