golang 依賴管理之 mod


go 很早就考慮了依賴管理的問題,內置 go get 命令,可以直接獲取對應的依賴,非常方便,但是有一個巨大的缺陷,沒有版本的維護和管理,而版本不一致可能會導致各種兼容性問題,因此出現了很多第三方依賴管理工具,depglide 就是其中的佼佼者,到了 go 1.11 官方終於推出了自己的依賴管理工具 mod,並內置在 go 版本中,go mod 使用簡單,功能強大,並且能自動兼容大多數之前的第三方工具,大量優秀的開源庫都已經切換到了 go mod,大有一統江湖之勢

GO111MODULE

一個最大的變化是 golang 的項目終於不再依賴 $GOPATH 目錄了,之前的項目由於 import 機制問題,所有項目都位於 $GOPATH/src 目錄下,雖然也沒有太大的問題,但總是讓人感覺很怪,go 1.11 終於調整了這個問題,將代碼從 $GOPATH 中遷出了,為了兼容之前研發模式,也仍然支持放到 $GOPATH 下,通過 GO111MODULE 環境變量控制

  • GO111MODULE=off: 關閉 mod,查找 vendor 目錄和 $GOPATH 路徑下的依賴
  • GO111MODULE=on: 開啟 mod, 僅根據 go.mod 下載和查找依賴
  • GO111MODULE=auto: 默認值,在非 $GOPATH 路徑並且包含 go.mod 的項目中才開啟 mod

主要命令

go mod init     # 在新的 go 項目中執行,自動分析依賴,創建 go.sum
go mod tidy     # 自動分析依賴,並自動添加和刪除依賴
go mod vendor   # 創建 vendor 目錄,將依賴拷貝到當前的 vendor 文件夾下
go mod download # 手動下載依賴
  1. 對於一個新的 go 項目,只需要新建項目的時候執行一下 go mod init
  2. 之后每次庫更新,只需要先在代碼中 import 對應庫,然后執行 go mod tidy 即可(也可用 go mod download 手動下載)

庫版本更換

手動修改 go.mod 文件中的 require 字段,重新執行 go mod tidy 即可

require (
	github.com/gin-gonic/gin v1.4.0
)

golang 的版本使用以 v 開頭的三位版本號,其中第一位表示有重大本本的更新,當發布一個 v2+ 版本的庫時,module my-module 應該改為 module my-module/v2,否則引入該庫需要在增加 +incompatible 后綴

require (
	github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible
)

解決 GFW 問題

因為一些原因,國內的網絡訪問不到 golang.org 上的庫,好在大部分庫在 github 上都有鏡像,可以用 replace 命令設置鏡像,下面是我碰到的一些庫

replace (
	cloud.google.com/go => github.com/googleapis/google-cloud-go v0.0.0-20190603211518-c8433c9aaceb
	go.etcd.io/bbolt => github.com/etcd-io/bbolt v1.3.4-0.20191001164932-6e135e5d7e3d
	go.uber.org/atomic => github.com/uber-go/atomic v1.4.1-0.20190731194737-ef0d20d85b01
	go.uber.org/multierr => github.com/uber-go/multierr v1.2.0
	go.uber.org/zap => github.com/uber-go/zap v1.10.1-0.20190926184545-d8445f34b4ae
	golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190605123033-f99c8df09eb5
	golang.org/x/exp => github.com/golang/exp v0.0.0-20190510132918-efd6b22b2522
	golang.org/x/image => github.com/golang/image v0.0.0-20190523035834-f03afa92d3ff
	golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422
	golang.org/x/mobile => github.com/golang/mobile v0.0.0-20190607214518-6fa95d984e88
	golang.org/x/net => github.com/golang/net v0.0.0-20190606173856-1492cefac77f
	golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20190604053449-0f29369cfe45
	golang.org/x/sync => github.com/golang/sync v0.0.0-20190423024810-112230192c58
	golang.org/x/sys => github.com/golang/sys v0.0.0-20190602015325-4c4f7f33c9ed
	golang.org/x/text => github.com/golang/text v0.3.2
	golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4
	golang.org/x/tools => github.com/golang/tools v0.0.0-20190608022120-eacb66d2a7c3
	google.golang.org/api => github.com/googleapis/google-api-go-client v0.6.0
	google.golang.org/appengine => github.com/golang/appengine v1.6.1
	google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190605220351-eb0b1bdb6ae6
	google.golang.org/grpc => github.com/grpc/grpc-go v1.21.1
)

GO 1.12 之后支持了一個新的環境變量 GOPROXY,用來設置依賴的代理地址,有兩個共用的地址:社區的 goproxy.io 和又拍雲的 goproxy.cn,親測好用

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

緩存

go mod 更新依賴后會在本地緩存,緩存路徑 $GOPATH/pkg/mod

IDE 支持

goland

啟用 mod 配置

【Goland】→【Preference】→【Go Module (vgo)】→ 【Enable Go Modules (vgo)】→ 【OK】

啟用 mod 之后,goland 會自動檢查依賴,並自動更新 go.sum,從而引入依賴庫,一般情況下都是好使的,偶爾不好使,手動執行下 go mod tidy 即可

vscode

vscode 好像不會自動更新,手動執行 go mod tidy 之后重啟才能生效

鏈接

轉載請注明出處
本文鏈接:https://tech.hatlonely.com/article/56


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM