成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 語言 Vendor 在 Gopath 和 Modules 中的區別

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

01介紹

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

02GOPATH

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

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

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

03Vendor

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

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

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

我們只需將 vendor 目錄一起提交到代碼倉庫中,新成員在下載 Golang 項目后,構建項目就不會改變三方依賴包的版本。

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

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

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

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

04Modules

Golang 官方在總結 Golang 社區推出的各種三方包依賴管理工具遇到的問題的基礎上,在 Golang v1.11 版本中,推出 Go Module 構建模式。

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

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

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

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

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

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

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

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

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

05總結

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

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

介紹了 vendor 機制在 GOPATH 構建模式和在 Go Module 構建模式中使用的區別是什么,為什么在 Go Module 構建模式中仍然需要使用 vendor 機制,如何在 Go Module 構建模式中使用 vendor 機制。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2021-12-27 03:36:09

語言For Golang

2023-11-20 22:44:09

Golang并發

2023-11-29 07:47:29

Golang函數

2021-08-17 11:14:49

VoidJSTS

2021-11-10 15:18:16

JavaGo命令

2021-03-23 08:21:06

GolangPython字符

2023-11-05 12:20:10

匿名函數Golang

2022-10-27 19:32:20

切片golang數組

2023-10-24 16:03:34

GoGolang

2020-10-22 06:59:09

GolangRust語言

2021-07-12 05:05:59

Golang語言字段

2024-02-27 22:31:58

Golang日志優化

2022-12-31 14:51:48

微服務Golang

2021-06-09 23:36:46

Golang語言版本

2023-03-29 08:03:53

2023-10-28 16:30:19

Golang開發

2021-03-27 10:56:17

promisethenfinally

2022-02-13 23:10:46

Golang語言變量

2023-10-22 20:20:37

FiberGo

2024-01-05 08:17:53

FiberGolang路由
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品九九九 | 欧美高清视频 | 九一国产精品 | 日本一区二区视频 | 国产精品成人一区二区三区吃奶 | 亚洲精品乱码久久久久久蜜桃91 | 久久久无码精品亚洲日韩按摩 | 久久99久久98精品免观看软件 | 免费在线看黄 | 国产高清视频在线 | 国产在线精品一区二区三区 | 欧美激情在线精品一区二区三区 | 亚洲视频中文字幕 | 亚洲国产看片 | 欧美亚洲一区二区三区 | 神马福利| 欧美精品成人一区二区三区四区 | 伦理二区 | 亚洲国产精品一区在线观看 | 精品视频一区二区 | 亚洲国产成人av | 成年人视频在线免费观看 | 中文字幕国产一区 | 欧美日韩在线一区二区 | 日韩免费视频 | 国产精品不卡视频 | 久久久久久国产精品 | 99久久精品国产毛片 | 91网站在线看 | 中文字幕欧美日韩 | 日韩av在线中文字幕 | 色吊丝2| 欧美三级电影在线播放 | www.888www看片| 婷婷成人在线 | 欧美精品一区在线 | 亚洲97 | 中文字幕成人av | 成人三级网址 | 日韩视频一区二区 | 国产精品91视频 |