Go 開發常用操作技巧 -- 模塊管理
Go 依賴管理經歷了 3 個階段,GOPATH、Go Vendor、Go Module。
- GOPATH
GOPATH
是 Go 語言的一個環境變量,它是 Go 項目的工作區。目錄有 3 個結構:
-
bin:項目編譯的二進制文件
-
pkg:項目編譯生成的 lib 包
-
src:項目源碼
go get 會下載最新版本的包到 src 目錄下。因爲 src 下只能允許一個版本的存在,所以對於多個項目依賴同一個庫的不同版本這種情況,GOPATH 管理模式就顯得力不從心了。至此,Go Vendor 出現了。
- Go Vendor
1.5 版本推出了vendor
機制。就是每個項目的根目錄下有一個 vendor 目錄,裏面存放了該項目的依賴包。go build
的時候會先去 vendor 目錄中查找依賴,如果沒有找到再去 GOPATH 目錄下查找。這樣每個項目引入一份依賴的副本,解決了多個項目需要使用同一個 package 依賴的衝突問題。
vendor 機制的缺點是,同一個依賴包如果不同工程想重用,都必須各自複製一份在自己的 vendor 目錄下。不能重用,使得冗餘度上升。
- 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 常用命令:
-
go mod download:下載模塊到本地緩存,緩存路徑是 $GOPATH/pkg/mod/cache
-
go mod edit:是提供了命令版編輯 go.mod 的功能,例如
go mod edit -fmt go.mod
會格式化 go.mod -
go mod graph:把模塊之間的依賴圖顯示出來
-
go mod init:在當前文件夾下初始化一個新的 module,創建 go.mod 文件
-
go mod tidy:增加缺失的包,移除沒用的包
-
go mod vendor:把依賴拷貝到 vendor 目錄下
-
go mod verify:校驗依賴
-
go mod why:解釋爲什麼需要包和模塊
- 創建 module
工程項目可以放在 GOPATH 路徑之外,執行go mod init modulename
命令可以創建一個 go.mod 文件。在項目根目錄建一個 go.mod 文件即可。
go.mod 文件結構
-
module :指定模塊的名稱 (路徑)
-
go :依賴的原生 Go SDK 版本
-
require :項目所依賴的模塊
-
replace :可以替換依賴的模塊
-
exclude :可以忽略依賴的模塊
- 添加依賴
在 Go1.16 版本之前,運行 go 命令(go run、go build、go test)時,會自動下載並修改 go.mod 文件。
在 Go1.16 版本中,運行 go 命令,如果 import 的依賴再 go.mod 文件中沒有,就不會再自動下載,而會提示錯誤,需要手動執行 go get
命令下載對應的包。因爲自動下載的方式,如果在導入的包沒有提供任何依賴的情況下自動添加新的依賴,有可能會引起公共依賴包的升級等。
- go get 更新依賴
-
go get -u :更新到最新的次要版本或者修訂版本 (x.y.z)
-
go get -u=patch :更新到最新的修訂版本
-
go get package@version :更新到指定的版本號 version
-
運行 go get 如果有版本的更改,那麼 go.mod 文件也會作出相應的更改。
- 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