go mod 依賴管理的具體使用
注:如果你的 GoLand 不會自動拉取依賴,檢查一下 IDE 配置里面是不是沒有啟用 Go Modules。
go mod 介紹
Modules 官方定義為:
模塊是相關(guān) Go 包的集合。modules 是源代碼交換和版本控制的單元。go 命令直接支持使用 modules,包括記錄和解析對其他模塊的依賴性。
modules 替換舊的基于 GOPATH 的方法來指定在給定構(gòu)建中使用哪些源文件。
mod 相關(guān)環(huán)境變量
# Modules 開關(guān) GO111MODULE="auto" # Go 模塊代理(脫離VCS版本控制方式,直接通過鏡像站點來拉?。? GOPROXY="https://proxy.golang.org,direct" # 國內(nèi)無法訪問 # 保證拉取到的模塊版本數(shù)據(jù)未經(jīng)過篡改 GOSUMDB="sum.golang.org" # 國內(nèi)無法訪問 # 私有模塊配置(用于Go 模塊代理無法訪問到的地方,如私有庫) GONOPROXY="" GONOSUMDB="" GOPRIVATE=""
如何使用 go mod
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
我們可以先設(shè)置一下 GO111MODULE 和 GOPROXY 環(huán)境變量,可以直接加到環(huán)境變量中:
GO111MODULE=on開啟 go modules 功能GOPROXY設(shè)置 go 代理,下載依賴的時候可以更快地下載
go.mod 文件
啟用了 Go modules 的項目,初始化項目時,會生成一個 go.mod 文件。描述了當前項目(也就是當前模塊)的元信息
# module:用于定義當前項目的模塊路徑。
module github.com/eddycjy/module-repo
# go:用于標識當前模塊的 Go 語言版本,值為初始化模塊時的版本,目前來看還只是個標識作用。
go 1.13
# require:用于設(shè)置一個特定的模塊版本。
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect # indirect 標識表示該模塊為間接依賴
example.com/strawberry // incompatible
)
# exclude:排除一個特定的模塊版本。
exclude example.com/banana v1.2.4
# replace:用于將一個模塊版本替換為另外一個模塊版本。
replace example.com/banana => example.com/fish
go mod 命令
go mod download:下載依賴包go mod edit:編輯 go.modgo mod graph:打印模塊依賴圖go mod init:初始化新的 go module 在當前目錄(嗯,是的,我們寫的代碼其實也等于是一個 go module)go mod tidy:拉取缺少的模塊,移除不用的模塊go mod vendor:將依賴復(fù)制到 vendor 下go mod verify:驗證依賴是否正確go mod why:解釋為什么需要依賴
go.mod 文件
module hello go 1.18
go.mod 文件一旦創(chuàng)建后,它的內(nèi)容將會被 go toolchain 全面掌控。go toolchain 會在各類命令執(zhí)行時,比如 go get、go build、go mod 等修改和維護 go.mod 文件。
go.mod 提供了 module,require,replace 和 exclude 四個命令。
module:指定包的名字(路徑)require:指定依賴項模塊replace:替換依賴模塊(比如自己修改了一版,就可以使用replace將依賴替換為自己的實現(xiàn),但是代碼里面import路徑還是舊的路徑)exclude:用于排除某個包的特定版本,與replace類似,僅在當前 module 為main module時有效,其他項目引用當前項目時,exclude指令會被忽略
go module 安裝依賴的原則是先拉取最新的 release tag,若無則拉最新的 commit。
go 會自動生成一個 go.sum 文件來記錄 dependency tree。
go get 升級
go get -u need-upgrade-package
升級后會將新的依賴版本更新到 go.mod,也可以使用 go get -u 升級所有依賴。
- 運行
go get -u將會升級到最新的次要版本或者修訂版本(x.y.z 是修訂版本號,y 是次要版本號) - 運行
go get -u=patch將會升級到最新的修訂版本 - 運行
go get package@version將會升級到指定的版本號 version - 運行
go get如果有版本的更改,那么go.mod文件也會更改
go.sum
這個文件記錄了當前拉取的實際的版本號??梢员WC我們每次拉取的都是相同的版本,除非我們手動去更新。
不同模式的命令區(qū)別
1. gopath模式
在工程經(jīng)過go build、go install或 go get等指令后,會將拉取的第三方xxx依賴包放在GOPATH/src目錄下
2. go vendor模式
go build 時的應(yīng)用路徑搜索調(diào)整成為 優(yōu)先搜當前工程路徑/vendor目錄
2. go module模式
拉取依賴路徑
Go Modules 模式下,下載的包是存在 $GOPATH/pkg/mod 目錄下的拉取指定版本
GoModules 模式下,可以下載指定版本的包
go get {模塊名}@{最新版本: latest|分支: master|tag: v0.3.2|hash: 342b2e}
通常拉取到本地后,配合go mod tidy和go mod vendor就能有效的加載到我們程序中使用的包,同時會更新掉go.mod配置文件。
到此這篇關(guān)于go mod 依賴管理的具體使用的文章就介紹到這了,更多相關(guān)go mod 依賴管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點
這篇文章主要介紹了詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

