首頁 >後端開發 >Golang >詳解 golang 依賴管理之 mod

詳解 golang 依賴管理之 mod

藏色散人
藏色散人轉載
2021-04-08 16:03:502325瀏覽

下面由golang教學專欄跟大家介紹golang 依賴管理之 mod ,希望對需要的朋友有幫助!

詳解 golang 依賴管理之 mod

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://blog.golang.org/using-go-modules
  • #Go Modules: https://blog.csdn.net/ytd7777/article/details/86898187
  • goproxy.io: https://goproxy.io/
#轉載請註明出處
本文連結:https://tech.hatlonely.com/article/56
#

以上是詳解 golang 依賴管理之 mod的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除