品牌網(wǎng)站建設(shè)多少錢(qián)品牌推廣策略分析
目錄
各版本依賴(lài)管理的時(shí)間分布 ???????????
一、GOPATH
1. GOROOT是什么
定義:
作用:
默認(rèn)值:
是否需要手動(dòng)設(shè)置:
查看當(dāng)前的 GOROOT:
2. GOPATH:工作區(qū)目錄
定義:
作用:
默認(rèn)值:
目錄結(jié)構(gòu):
如何設(shè)置 GOPATH:
查看當(dāng)前的 GOPATH:
缺點(diǎn):
GOROOT 與 GOPATH 的主要區(qū)別
總結(jié)
二、Vendor
三、Go Module
1、module的定義
語(yǔ)義化版本的規(guī)范
2、快速實(shí)戰(zhàn)
Go Module 與 go mod 的區(qū)別
舉例
總體來(lái)說(shuō):
3、go.mod 與 指令
1. go.mod 文件
go.mod 文件自動(dòng)生成
2. go mod 命令行管理
2.1 go mod init
2.2 go mod tidy
2.3 go mod download
2.4 go mod vendor
2.5 go mod graph
2.6 go mod verify
?
?
Go的依賴(lài)管理主要經(jīng)過(guò)了3個(gè)重要階段
1、GOPATH
2、Vendor
3、Go Module
早期Go使用GOPATH進(jìn)行依賴(lài)管理,但是GOPATH不方便管理多個(gè)版本。
后來(lái)增加了Vendor,允許把項(xiàng)目連同代碼一起管理。
18年,Go1.11引入全新的依賴(lài)管理工具Go Module,直到Go1.14才走向成熟。
? ? 從GOPATH到vendor,再到Go Module,這是一個(gè)不斷演進(jìn)的過(guò)程,了解每代依賴(lài)管理的痛點(diǎn),能夠更好的明白下一代依賴(lài)管理的初衷。
? ? 故,我將會(huì)從GOPATH講起,經(jīng)過(guò)vendor最后到Go Module。
?
各版本依賴(lài)管理的時(shí)間分布 ???????????
依賴(lài)管理方法 | 引入版本 | 時(shí)間 | 狀態(tài) |
GOPATH | Go 1.0 | 2012 年(Go 1.0) | Go 的早期依賴(lài)管理方式,已逐步被 Go Module 取代,但仍在支持 |
Vendor | Go 1.5 | 2015 年 | 一種解決 GOPATH 依賴(lài)沖突的過(guò)渡方案,Go 1.6 起成為默認(rèn)方案,但現(xiàn)在被 Go Module 取代 |
Go Module | Go 1.11 | 2018 年(實(shí)驗(yàn)) | Go 1.13 起成為默認(rèn)依賴(lài)管理方式,是目前官方推薦的管理方案 |
一、GOPATH
? ? 剛剛接觸GO的新手,一般都對(duì)GOPATH感到困惑。通常由兩方面造成的
? ? Go語(yǔ)言解決辦法有兩種:
- 將從前的卸了,再親自安裝一次
- 聽(tīng)我下面的講解 Ψ( ̄? ̄)Ψ
? ? 建議選擇第二種方法,既然來(lái)到了這里,就要相信我的講解。本部分主要介紹GOPATH及與其密切相關(guān)的GOROOT,首先看一下GOROOT。
1. GOROOT是什么
定義:
? ? 通常,我們說(shuō)安裝Go語(yǔ)言,實(shí)際上是安裝Go的編譯器與標(biāo)準(zhǔn)庫(kù),兩者位于同一個(gè)安裝包中。
? ? 假如在Windows上,使用Installer安裝Go,他們會(huì)被默認(rèn)安裝到C:\Go目錄下。該目錄即為GOROOT目錄。
? ? 里面包含了開(kāi)發(fā)Go應(yīng)用程序所需要的所有組件。如編譯器、標(biāo)準(zhǔn)庫(kù)和工具所在的位置。
? ? 它是 Go 語(yǔ)言自帶的環(huán)境變量,用戶(hù)通常無(wú)需更改。
作用:
- Go 編譯器及工具鏈所在的目錄。
- Go 的標(biāo)準(zhǔn)庫(kù)代碼(如 fmt、os 等)。
默認(rèn)值:
? ? 安裝 Go 語(yǔ)言時(shí),GOROOT 會(huì)自動(dòng)配置為安裝目錄的路徑。例如:
- Windows 上:C:\Go
- macOS/Linux 上:/usr/local/go
是否需要手動(dòng)設(shè)置:
? ? 一般不需要手動(dòng)設(shè)置 GOROOT,Go 安裝程序會(huì)自動(dòng)配置。如果需要自定義(比如安裝多個(gè) Go 版本),可以手動(dòng)設(shè)置環(huán)境變量 GOROOT。
查看當(dāng)前的 GOROOT:
go env GOROOT // 查看路徑
2. GOPATH:工作區(qū)目錄
定義:
GOPATH 是 Go 工作區(qū)目錄,用于存放:
- 代碼:所有項(xiàng)目的源碼(src)。
- 依賴(lài)包:第三方庫(kù)的下載路徑(pkg)。
- 可執(zhí)行文件:編譯后的二進(jìn)制文件(bin)。
作用:
- Go 工具鏈在哪里查找和存儲(chǔ)你的 Go 項(xiàng)目和依賴(lài)。
- go install 和 go build 命令,生成可執(zhí)行文件或中間文件。
默認(rèn)值:
? ? 如果沒(méi)有顯式設(shè)置,Go 會(huì)將 GOPATH 默認(rèn)設(shè)置為用戶(hù)主目錄下的 go 文件夾:
- Windows 上:%USERPROFILE%\go
- macOS/Linux 上:$HOME/go
目錄結(jié)構(gòu):
一個(gè)典型的 GOPATH 目錄結(jié)構(gòu)如下:
GOPATH/├── bin/ ?????# 存放可執(zhí)行文件├── pkg/ ?????# 存放已編譯的依賴(lài)包└── src/ ?????# 存放 Go 項(xiàng)目的源碼
如何設(shè)置 GOPATH:
你可以手動(dòng)設(shè)置 GOPATH 為自定義的目錄(可多路徑,但較少用)。例如:
# Linux/macOSexport GOPATH=/path/to/your/workspace# Windows(通過(guò)系統(tǒng)環(huán)境變量設(shè)置)set GOPATH=C:\path\to\your\workspace
查看當(dāng)前的 GOPATH:
go env GOPATH
缺點(diǎn):
? ? GOPATH的優(yōu)點(diǎn)是簡(jiǎn)單,但是不能很好的適應(yīng)實(shí)際項(xiàng)目的工程需求。比如有兩個(gè)項(xiàng)目A和B,如果兩個(gè)項(xiàng)目都引用第三方庫(kù)T,只是版本不同。
- 使用,T v1.0
- 使用,T v2.0
? ? 由于編譯器固定依賴(lài)GOPATH / src 下查找GOPATH / src / T 這條路徑,又因?yàn)闊o(wú)法在同一個(gè)GOPATH目錄下儲(chǔ)存T的兩個(gè)版本。所以A、B無(wú)法共享同一個(gè)GOPATH,需要各自維護(hù)一個(gè),帶來(lái)極大的不便。針對(duì)GOPATH的缺點(diǎn),Go語(yǔ)言社區(qū)提供了Vendor機(jī)制。從此依賴(lài)管理進(jìn)入了第二階段。
GOROOT 與 GOPATH 的主要區(qū)別
區(qū)別 | GOROOT | GOPATH |
定義 | Go 安裝目錄 | Go 工作區(qū),存放用戶(hù)項(xiàng)目和依賴(lài) |
包含內(nèi)容 | 標(biāo)準(zhǔn)庫(kù)、編譯器、工具等 | 用戶(hù)源碼、依賴(lài)包緩存、可執(zhí)行文件等 |
是否可修改 | 一般不需要修改,由 Go 自動(dòng)設(shè)置 | 用戶(hù)可以設(shè)置為任意路徑 |
使用場(chǎng)景 | Go 標(biāo)準(zhǔn)庫(kù)查找、工具鏈?zhǔn)褂?/p> | 非模塊化項(xiàng)目存儲(chǔ)、編譯生成文件 |
總結(jié)
- ?指向 Go 安裝目錄,包含標(biāo)準(zhǔn)庫(kù)和工具,不建議修改。
- ?指向工作區(qū)目錄,存放用戶(hù)項(xiàng)目和依賴(lài),是用戶(hù)項(xiàng)目的主要工作目錄。
?
二、Vendor
? ? 上部分,我們介紹了使用GOPATH的痛點(diǎn):多個(gè)項(xiàng)目無(wú)法共享同一個(gè)GOPATH,雖然vendor仍然無(wú)法多個(gè)項(xiàng)目無(wú)法共享同一個(gè)GOPATH,但是它提供了一種機(jī)制,讓項(xiàng)目的依賴(lài)隔離而不互相干擾。
? ? 自 Go 1.6起,vendor機(jī)制正式啟用,它允許把項(xiàng)目存放在vendor的目錄中,可以把這個(gè)vendor目錄,簡(jiǎn)單的理解成私有的GOPATH目錄。項(xiàng)目編譯時(shí),編譯器會(huì)優(yōu)先從vendor目錄中尋找依賴(lài)包,如果在vendor中找不到,才會(huì)去GOPATH中尋找。
? ? 雖然vendor并未推出歷史舞臺(tái),甚至在離線(xiàn)場(chǎng)合下更適用。
? ? 但是Go Module已成為主流,如果讀者們想得到vendor更詳細(xì)的資料,可以上網(wǎng)另行查詢(xún)。
?
三、Go Module
在Go 1.11中,Module的特性首次被引用,標(biāo)志著Go的依賴(lài)進(jìn)入第三個(gè)時(shí)代。
Go Module 基本上解決了 GOPATH 和 vendor 時(shí)代的遺留問(wèn)題,看到這里的讀者基本能了解:
GOPATH 時(shí)代,最大的困惑時(shí)無(wú)法讓多個(gè)項(xiàng)目共享package的不同版本。
在vendor時(shí)代,可以通過(guò)將每個(gè)項(xiàng)目依賴(lài)的 package 放到 vendor 中可以解決,但是使用 vendor的問(wèn)題是無(wú)法很好的管理依賴(lài)package,比如升級(jí)package。
而Go Module 更像一種全新的依賴(lài)管理方案。
?
Go Module基礎(chǔ)
1、module的定義
? ? 官方給 module 的定義是:A module is a collection of related Go packages that are versioned together as a single unit.
? ? 定義非常清晰,一組 package 的集合一起被標(biāo)記版本,即一個(gè) module。
? ? 通常而言,一個(gè)倉(cāng)庫(kù)包含一個(gè) module(雖然也可以包含多個(gè),但不推薦),所以倉(cāng)庫(kù)、module 和 package 的關(guān)系如下:
????????◎ ?一個(gè)倉(cāng)庫(kù)包含一個(gè)或多個(gè) module。
????????◎ ?你每個(gè)module 包含一個(gè)或多個(gè) package。
????????◎ ?每個(gè) package 包含一個(gè)或多個(gè)源文件。
? ? 另外,一個(gè) module 的版本號(hào)規(guī)則必須遵循語(yǔ)義化規(guī)范,版本號(hào)必須使用v(major).(minor).(patch)格式,比如v0.1.0、v1.2.3等。
? ? 下方給出了,語(yǔ)義化版本的規(guī)范。
語(yǔ)義化版本的規(guī)范
????語(yǔ)義化版本 (Semantic Versioning) 已成為事實(shí)上的標(biāo)準(zhǔn),幾乎知名的開(kāi)源項(xiàng)目都遵循該規(guī)范,更詳細(xì)的信息請(qǐng)前往 semver官網(wǎng)査看,在此只提煉一些要點(diǎn),以便于后續(xù)的閱讀。
????版本格式 v(major).(minorr).(patch)中的 major 指的是大版本,minor 指的是小版本,patch 指的是補(bǔ)丁版本。
????????◎ major: 當(dāng)發(fā)生不兼容的改動(dòng)時(shí)才可以增加該版本,比如 v2.x.y與 v1.x.y是不兼容的。
????????◎ minor: 當(dāng)有新增特性時(shí)才可以增加該版本,比如 v1.17.0 是在 v1.16.0的基礎(chǔ)上增加了新的特性,同時(shí)兼容 v1.16.0。
????????◎ patch: 當(dāng)有 Bug修復(fù)時(shí)才可以增加該版本,比如 v1.17.1修復(fù)了 v1.17.0 上的 Bug,沒(méi)有增加新特性。
? ? 語(yǔ)義化版本規(guī)范的好處是,用戶(hù)通過(guò)版本號(hào)就能了解版本信息。
2、快速實(shí)戰(zhàn)
? ? 紙上得來(lái)終覺(jué)淺,覺(jué)知此事要躬行,后續(xù)我會(huì)在補(bǔ)充一下實(shí)戰(zhàn),讓大家對(duì)Go Module認(rèn)識(shí)的更加清楚。
講到這里了,大家肯定對(duì) go mod 與 Go Module 之間的差異有些許疑惑,接下來(lái)我來(lái)細(xì)細(xì)講解。
Go Module 與 go mod 的區(qū)別
區(qū)別 | Go module | go mod 命令 |
定義 | Go 的模塊化系統(tǒng),用于管理依賴(lài)和版本 | Go 工具鏈中的子命令,用于操作和管理 Go module |
作用 | 使得 Go 項(xiàng)目支持依賴(lài)版本管理、減少?zèng)_突 | 具體操作模塊的工具,包含初始化、下載、清理等子命令 |
使用方式 | 自動(dòng)在項(xiàng)目根目錄生成 go.mod ?文件,記錄模塊的依賴(lài)信息 | 使用如 go mod init ?等命令管理模塊依賴(lài) |
依賴(lài)管理 | 管理項(xiàng)目的依賴(lài)關(guān)系和版本控制 | 提供修改 go.mod ?文件的命令,以方便操作模塊 |
舉例
在項(xiàng)目的根目錄下:
# 初始化一個(gè) Go module,會(huì)在當(dāng)前目錄生成 go.mod 文件go mod init my_project# 整理依賴(lài),自動(dòng)移除未使用的依賴(lài)包go mod tidy# 下載所有依賴(lài)go mod download
總體來(lái)說(shuō):
- module 是 的模塊化系統(tǒng)的概念,它定義了依賴(lài)管理的機(jī)制。
- mod 是管理 Go module 的命令集合,用于具體執(zhí)行對(duì)模塊的各種操作。
3、go.mod 與 指令
在 Go 中,go.mod 文件和 go mod 命令行工具提供了依賴(lài)管理的核心功能。以下是詳細(xì)說(shuō)明。
1. go.mod 文件
go.mod 是 Go 項(xiàng)目的模塊文件,用于定義模塊名、依賴(lài)項(xiàng)和版本等信息。一個(gè)典型的 go.mod 文件示例如下:
module example.com/myappgo 1.20require (github.com/gin-gonic/gin v1.8.1golang.org/x/crypto v0.5.0
)replace golang.org/x/crypto v0.5.0 => ./local/crypto
- module:定義當(dāng)前項(xiàng)目的模塊路徑,一般為代碼倉(cāng)庫(kù)路徑。
- go:指定所使用的 Go 版本(這里是 1.20)。
- require:列出當(dāng)前模塊所依賴(lài)的其他模塊及其版本。
- replace:用于指定模塊的替代版本或本地替代路徑,通常在開(kāi)發(fā)調(diào)試階段使用。
go.mod 文件自動(dòng)生成
? ? 可以通過(guò)在項(xiàng)目目錄運(yùn)行 go mod init <module_name> 來(lái)自動(dòng)生成 go.mod 文件。例如,go mod init example.com/myapp。
2. go mod 命令行管理
go mod 命令行工具用于管理模塊的依賴(lài)項(xiàng)和版本控制,以下是常用的命令:
2.1 go mod init <module_name>
初始化當(dāng)前項(xiàng)目的模塊系統(tǒng),生成 go.mod 文件:
go mod init example.com/myapp
2.2 go mod tidy
清理依賴(lài),移除不再使用的包并添加遺漏的包。
go mod tidy
- go mod tidy 會(huì)檢查 go.mod 和 go.sum 文件,移除未引用的模塊,并確保所有依賴(lài)項(xiàng)存在于 go.sum 文件中。
2.3 go mod download
下載依賴(lài)包到本地的模塊緩存中,但不會(huì)修改 go.mod 文件。
go mod download
2.4 go mod vendor
將所有依賴(lài)的包下載到項(xiàng)目的 vendor 目錄中。
go mod vendor
- Go 1.14 引入的 vendor 模式在構(gòu)建項(xiàng)目時(shí)優(yōu)先從 vendor 目錄中查找依賴(lài)項(xiàng),可以用來(lái)解決部署環(huán)境中網(wǎng)絡(luò)不通暢的問(wèn)題。
2.5 go mod graph
展示依賴(lài)模塊之間的關(guān)系圖,幫助理解依賴(lài)結(jié)構(gòu)。
go mod graph
2.6 go mod verify
驗(yàn)證依賴(lài)的包文件是否正確,檢查 go.sum 文件中保存的哈希值是否匹配下載的模塊。
go mod verify
講到這里也接近了尾聲,創(chuàng)作本篇博客傾盡了全力,雖不免仍有些片面。但從基礎(chǔ)上看,帶領(lǐng)大家,重新認(rèn)識(shí)了一遍依賴(lài)管理,并從GOPATH講起,經(jīng)過(guò)vendor最后到Go Module,還是不錯(cuò)的。
希望大家有收獲,期待下次再見(jiàn)。
?
?