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