自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Golang 語言 Vendor 在 Gopath 和 Modules 中的區(qū)別

開發(fā) 前端
在 Golang 語言中,Golang 程序是由 Golang Package 組成的,go build 的過程實際上就是編譯 Golang Package。本文我們介紹 Golang 構(gòu)建模式主要演進(jìn)的三個階段,分別是 GOPATH、 引入 vendor 機(jī)制的 GOPATH 和 Go Module。

01介紹

在 Golang 語言中,Golang 程序是由 Golang Package 組成的,go build 的過程實際上就是編譯 Golang Package。本文我們介紹 Golang 構(gòu)建模式主要演進(jìn)的三個階段,分別是 GOPATH、 引入 vendor 機(jī)制的 GOPATH 和 Go Module。

02GOPATH

Golang 初期版本中就原生內(nèi)置了 GOPATH 的構(gòu)建模式,Golang 程序在編譯時,Golang 編譯器會在 GOPATH 環(huán)境變量配置的本地路徑下,查找 Golang 程序依賴的三方包,如果依賴包不存在,go build 命令將返回錯誤「無法找到包 XXX」,此時,我們需要使用 go get 命令手動將 Golang 程序依賴的三方包下載到 GOPATH 環(huán)境變量配置的本地路徑下,然后再嘗試執(zhí)行 go build 命令。

go get 命令雖然方便,它可以將依賴包以及依賴包的依賴包自動下載到 GOPATH 環(huán)境變量配置的本地路徑下,但是讀者朋友們需要注意的是,go get 命令下載的依賴包是當(dāng)前依賴包的最新版本,如果我們對依賴包的版本有要求,就不能使用 go get 命令。

比如在多人開發(fā)的 Golang 項目中,新加入成員將 Golang 項目下載到本地,使用 go get 命令下載依賴包時,正好趕上依賴包的版本更新了,此時,新成員使用 go build 命令構(gòu)建 Golang 程序,Golang 程序也將使用最新版本的三方依賴包。如果三方依賴包存在 bug 或不向下兼容,將直接影響 Golang 程序的穩(wěn)定性。

03Vendor

Golang 官方為了解決 go get 命令會下載最新版本依賴包的問題,在 Golang v1.5 版本中引入 vendor 機(jī)制。

所謂 vendor 機(jī)制,就是在 Golang 項目的目錄中,創(chuàng)建一個目錄名為 vendor 的目錄,將 Golang 項目的所有依賴包緩存到該目錄中。

Golang 程序在編譯時,Golang 編譯器會優(yōu)先在 vendor 目錄中查找 Golang 程序依賴的三方包,而不是在 GOPATH 環(huán)境變量配置的本地路徑下查找。

我們只需將 vendor 目錄一起提交到代碼倉庫中,新成員在下載 Golang 項目后,構(gòu)建項目就不會改變?nèi)揭蕾嚢陌姹尽?/p>

讀者朋友們需要注意的是,vendor 機(jī)制也引入了新的問題,比如想要使用 vendor 機(jī)制,Golang 項目必須在 GOPATH 環(huán)境變量配置的本地路徑下的 src 目錄中。

隨著項目不斷迭代,依賴的三方包也會越來越多,vendor 目錄會變得越來越大,將 vendor 目錄提交到代碼倉庫,不僅會影響下載代碼的速度,還會影響 Code Review。

此外,vendor 目錄中的三方依賴包,也需要我們手動管理,比如手動記錄依賴三方包的版本號,手動下載三方依賴包等。

Golang 社區(qū)為了解決 vendor 機(jī)制引入的問題,推出一些比較流行的解決三方包依賴管理的工具,比如 dep、gb、glide 等三方包依賴管理工具,但是這些社區(qū)推出的三方包依賴管理工具都有各自的問題。

04Modules

Golang 官方在總結(jié) Golang 社區(qū)推出的各種三方包依賴管理工具遇到的問題的基礎(chǔ)上,在 Golang v1.11 版本中,推出 Go Module 構(gòu)建模式。

關(guān)于 Go Module 構(gòu)建模式,官方 blog 有相關(guān)系列文章介紹,在之前的公眾號文章中,也有官方 blog 發(fā)表的 Go Module 相關(guān)文章的譯文。感興趣的讀者朋友可以按需翻閱一下。

Go Module 構(gòu)建模式可以將 Golang 項目代碼放在任意目錄,無需同 vendor 機(jī)制一樣,必須將 Golang 項目代碼放在 GOPATH 環(huán)境變量配置的本地目錄下的 src 目錄中。

因為 Golang 官方為了同時支持 GOPATH 構(gòu)建模式和 Go Module 構(gòu)建模式,在 Golang v1.11 版本中,Go Module 構(gòu)建模式默認(rèn)是「關(guān)閉」,除非手動開啟 Go Module 構(gòu)建模式,如果將 Go Module 構(gòu)建模式設(shè)置為「自動」,而 Golang 項目在 GOPATH 環(huán)境變量配置的目錄中的 src 目錄下,go build 命令優(yōu)先使用 GOPATH 構(gòu)建模式。

在 Golang v.13 版本中,Go Module 構(gòu)建模式默認(rèn)是「自動」,不管 Golang 項目在不在 GOPATH 環(huán)境變量配置的本地目錄中的 src 目錄下,只要項目根目錄中包含 go.mod 文件,就啟用 Go Module 構(gòu)建模式,否則啟用 GOPATH 構(gòu)建模式。

所以在 Golang v1.13 版本之前,如果想要使用 Go Module 構(gòu)建模式,那么 Golang 項目代碼不可以放在 $GOPATH/src 目錄中。

在 Golang v1.16 版本開始,Golang 已經(jīng)默認(rèn)開啟 Go Module 構(gòu)建模式,未來 Golang 官方還會考慮徹底移除 GOPATH 構(gòu)建模式,我建議讀者朋友們現(xiàn)在開始將 GOPATH 構(gòu)建模式的老項目遷移到 Go Module 構(gòu)建模式,并且在新項目中直接使用 Go Module 構(gòu)建模式。

Golang 項目使用 Go Module 構(gòu)建模式,那么還需要使用 vendor 機(jī)制嗎?答案是需要,因為 vendor 機(jī)制可以將 Golang 項目依賴的三方包緩存到 vendor 目錄,這樣在無法訪問網(wǎng)絡(luò)的環(huán)境下,我們可以在 vendor 機(jī)制下使用 Go Module 構(gòu)建模式,或者在構(gòu)建性能敏感的環(huán)境中使用 Go Module 構(gòu)建模式,比如在使用內(nèi)部 CI 工具構(gòu)建 Golang 程序時。

在 Go Module 構(gòu)建模式下,vendor 機(jī)制無需像在 GOPATH 構(gòu)建模式下,需要我們手動管理三方依賴包的版本和下載,Golang 提供了 go mod vendor 命令,幫助我們創(chuàng)建和管理 vendor 目錄。

在我們想要基于 vendor 目錄緩存的三方依賴包構(gòu)建 Golang 程序,而不是基于本地緩存的 Go Module 構(gòu)建 Golang 程序時,可以在 go build 命令后面加上 -mod=vendor 參數(shù)。并且在 Golang v1.14 及以后的版本中,如果 Golang 項目根目錄下存在 vendor 目錄,go build 命令會默認(rèn)優(yōu)先基于 vendor 目錄緩存的三方依賴包構(gòu)建 Golang 程序,除非我們在 go build 命令后面加上 -mod=mod 參數(shù)。

05總結(jié)

本文我們介紹了 Golang 的構(gòu)建模式的演進(jìn)過程,Golang 官方先后推出三種構(gòu)建模式,分別是 GOPATH 構(gòu)建模式,引入 vendor 機(jī)制的 GOPATH 構(gòu)建模式和 Go Module 構(gòu)建模式。

介紹了為什么要引進(jìn) vendor 機(jī)制,它解決了什么問題,同時它又帶來了什么問題。官方基于社區(qū)推出的三方依賴包版本管理工具的基礎(chǔ)上推出 Go Module 構(gòu)建模式,是怎么解決 GOPATH 構(gòu)建模式中 vendor 機(jī)制引入的問題的。

介紹了 vendor 機(jī)制在 GOPATH 構(gòu)建模式和在 Go Module 構(gòu)建模式中使用的區(qū)別是什么,為什么在 Go Module 構(gòu)建模式中仍然需要使用 vendor 機(jī)制,如何在 Go Module 構(gòu)建模式中使用 vendor 機(jī)制。

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2021-12-27 03:36:09

語言For Golang

2023-11-20 22:44:09

Golang并發(fā)

2023-11-29 07:47:29

Golang函數(shù)

2021-08-17 11:14:49

VoidJSTS

2021-11-10 15:18:16

JavaGo命令

2022-10-27 19:32:20

切片golang數(shù)組

2021-03-23 08:21:06

GolangPython字符

2023-11-05 12:20:10

匿名函數(shù)Golang

2023-10-24 16:03:34

GoGolang

2021-07-12 05:05:59

Golang語言字段

2020-10-22 06:59:09

GolangRust語言

2024-02-27 22:31:58

Golang日志優(yōu)化

2022-12-31 14:51:48

微服務(wù)Golang

2023-03-29 08:03:53

2021-06-09 23:36:46

Golang語言版本

2023-10-28 16:30:19

Golang開發(fā)

2021-03-27 10:56:17

promisethenfinally

2022-02-13 23:10:46

Golang語言變量

2024-01-05 08:17:53

FiberGolang路由

2023-10-12 08:25:18

Javaequals內(nèi)存
點贊
收藏

51CTO技術(shù)棧公眾號