golang 依賴管理之 mod

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

GO111MODULE

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

  • 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 便可golang

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

golang 的版本使用以 v 開頭的三位版本號,其中第一位表示有重大本本的更新,當發佈一個 v2+ 版本的庫時,module my-module 應該改成 module my-module/v2,不然引入該庫須要在增長 +incompatible 後綴api

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,親測好用bash

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

緩存

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

IDE 支持

goland

啓用 mod 配置app

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

啓用 mod 以後,goland 會自動檢查依賴,並自動更新 go.sum,從而引入依賴庫,通常狀況下都是好使的,偶爾很差使,手動執行下 go mod tidy 便可工具

vscode

vscode 好像不會自動更新,手動執行 go mod tidy 以後重啓才能生效

連接

轉載請註明出處
本文連接: https://tech.hatlonely.com/article/56
相關文章
相關標籤/搜索