golang 依賴管理之 mod

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

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 之後重啓才能生效

鏈接

作者:hatlonely
鏈接:https://www.jianshu.com/p/2979dafe9a90
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章