go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題
背景
golang項(xiàng)目使用module進(jìn)行依賴(lài)及版本管理,私有項(xiàng)目或二次開(kāi)發(fā)的項(xiàng)目通過(guò)vendor進(jìn)行管理。
在一次修改代碼,打完tag,修改項(xiàng)目go.mod中依賴(lài)私有倉(cāng)庫(kù)的tag=v6.0.12后,使用 go mod tidy
更新依賴(lài),go.sum中的對(duì)應(yīng)倉(cāng)庫(kù)的tag對(duì)應(yīng)為v6.0.12;然后通過(guò) go mod vendor
更新vendor下面的modules.txt及私有倉(cāng)庫(kù),發(fā)現(xiàn)modulest.txt中記錄的依賴(lài)倉(cāng)庫(kù)的tag=v6.0.12已更新,但是倉(cāng)庫(kù)的內(nèi)容卻不是最新的。
分析
- 可能本地mod有緩存
- 之前已經(jīng)存在該tag,被刪除后,新建了相同的tag,導(dǎo)致該tag的hash相同,命中緩存,進(jìn)行
go mod tidy
后使用本地緩存中之前的tag的代碼,未進(jìn)行更新。
解決
刪除本地配置的$GOPATH環(huán)境變量中pkg/mod及pkg/mod/cache/download路徑下對(duì)應(yīng)的依賴(lài)倉(cāng)庫(kù)及其tag版本,重新使用下面的命令更新。
$ go mod tidy go: downloading pkg.xx.com/service/lib/db/v6 v6.0.13 $ go mod vendor
如果通過(guò)上面清除緩存的方式,vendor依賴(lài)倉(cāng)庫(kù)的內(nèi)容還沒(méi)有更新到最新的提交,可以在最新提交分支上重新創(chuàng)建一個(gè)新的tag,修改go.mod中依賴(lài)的tag為新創(chuàng)建的tag,再使用上面的 go mod tidy
和 go mod vendor
分別更新go mod和vendor依賴(lài)。
擴(kuò)展
在go1.11之前的版本中,golang 主要依靠vendor和GOPATH來(lái)管理依賴(lài)庫(kù),vendor相對(duì)主流,但現(xiàn)在官方更提倡go mod。
go get
go get之后下載文件的目錄位置:
1、GO111MODULE 如果為off,則在pkg目錄下;
2、GO111MODULE如果為on,則在src目錄下。
GOPATH
GOPATH模式下不方便使用同一個(gè)依賴(lài)包的多個(gè)版本。在GOMODULE模式下這個(gè)問(wèn)題得到了很好的解決。
GOPATH模式下,依賴(lài)包存儲(chǔ)在 $GOPATH/src
,該目錄下只保存特定依賴(lài)包的一個(gè)版本。而在GOMODULE模式下,依賴(lài)包存儲(chǔ)在 $GOPATH/pkg/mod
,該目錄中可以存儲(chǔ)特定依賴(lài)包的多個(gè)版本。
需要注意的是$GOPATH/pkg/mod目錄下有個(gè)cache目錄,它用來(lái)存儲(chǔ)依賴(lài)包的緩存,簡(jiǎn)單說(shuō),go命令每次下載新的依賴(lài)包都會(huì)在該cache目錄中保存一份。關(guān)于該目錄的工作機(jī)制我們留到GOPROXY章節(jié)時(shí)再詳細(xì)介紹。
接下來(lái),我們使用開(kāi)源項(xiàng)目github.com/google/uuid為例分別說(shuō)明GOPATH模式和GOMODULE模式下特定依賴(lài)包存儲(chǔ)機(jī)制。在下面的操作中,我們會(huì)使用GO111MODULE環(huán)境變量控制具體的模式:
- export GO111MODULE=off切換到GOPATH模式
- export GO111MODULE=on切換到GOMODULE模式。
go module
自從go1.11版本后,golang引入go mod 機(jī)制來(lái)管理項(xiàng)目的依賴(lài)庫(kù)及其版本,其中 go.mod 簡(jiǎn)要記錄了項(xiàng)目直接依賴(lài)庫(kù)的版本信息,
- go.sum詳細(xì)記錄了(項(xiàng)目直接或間接引用到的)各個(gè)依賴(lài)庫(kù)的版本及其對(duì)應(yīng)hash。
- go mod用于解決之前沒(méi)有地方記錄依賴(lài)包具體版本的問(wèn)題,方便依賴(lài)包的管理。
存放位置
一般第三方依賴(lài)庫(kù)(包括公司內(nèi)網(wǎng)gitlab上的依賴(lài)庫(kù)),其源碼都不被包含在項(xiàng)目?jī)?nèi)部,而是在編譯的時(shí)候通過(guò)go連接公網(wǎng)或內(nèi)網(wǎng)下載到本地配置的環(huán)境變量$GOPATH中,然后編譯成對(duì)應(yīng)的二進(jìn)制文件,移植到各種系統(tǒng)中使用。
go module存儲(chǔ)下載的依賴(lài)包,具體位置在$GOPATH/pkg/mod。
GOPATH 在不同平臺(tái)上的安裝路徑不同,具體可以通過(guò) go env
查看環(huán)境變量配置。
問(wèn)題
有時(shí)候需在無(wú)公網(wǎng)、無(wú)內(nèi)網(wǎng)(無(wú)法連接內(nèi)網(wǎng)gitlab)的情況下編譯go項(xiàng)目,比如斷網(wǎng)的情況,那么需要如何做呢?
面對(duì)這種場(chǎng)景,可以通過(guò) go get
或者 go mod vendor
將項(xiàng)目的依賴(lài)庫(kù)下載到項(xiàng)目?jī)?nèi)部,作為項(xiàng)目的一部分來(lái)編譯。
除此之外,還有一些使用 go mod vendor
的場(chǎng)景或者優(yōu)勢(shì):
- 雖然通常不會(huì)也不需要在無(wú)公網(wǎng)、無(wú)內(nèi)網(wǎng)環(huán)境實(shí)時(shí)編譯,因?yàn)間o的可移植性很好,常以可執(zhí)行文件方式交付部署,但并不能排除此種可能。
- 防止依賴(lài)庫(kù)因?yàn)槟撤N原因被刪除、移動(dòng),導(dǎo)致找不到依賴(lài)并編譯失敗。
- 對(duì)新手來(lái)說(shuō),下載一些墻外的依賴(lài)可能略有困難。
- 其他…總之,我們的目的是使用 go mod vendor,將項(xiàng)目的依賴(lài)庫(kù)下載到項(xiàng)目?jī)?nèi)部,即項(xiàng)目中包含依賴(lài)庫(kù)源碼,依賴(lài)庫(kù)如同項(xiàng)目的一部分,也受到項(xiàng)目的版本管控(git、svn…)。
go vendor
通過(guò) go mod tidy
下載并更新依賴(lài)倉(cāng)庫(kù)的版本后,再執(zhí)行 go mod vendor
可以將下載的依賴(lài)包存放在vendor命令下并更新vendor/modules.txt文件,而vendor/modules.txt文件則自動(dòng)記錄對(duì)應(yīng)的依賴(lài)及其tag版本,不需要手動(dòng)修改。
使用vendor的方式,相對(duì)于GOPATH或GOMODULE的方式,即使對(duì)應(yīng)tag的依賴(lài)包被刪除或丟失,只要vendor目錄中存在就可以直接編譯使用。
# 在vendor目錄下創(chuàng)建依賴(lài)包副本 # 用vendor/modules.txt記錄依賴(lài)包及版本 go mod vendor # 指定構(gòu)建方式,Go 1.14之后,默認(rèn)也是vendor模式構(gòu)建 go build -mod=vendor
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解
這篇文章主要介紹了golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10解析Golang中的鎖競(jìng)爭(zhēng)問(wèn)題
這篇文章主要介紹了golang中的鎖競(jìng)爭(zhēng)問(wèn)題,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10GO語(yǔ)言的數(shù)組array與切片slice詳解
這篇文章主要介紹了GO語(yǔ)言的數(shù)組array與切片slice,包括了GO語(yǔ)言數(shù)組定義賦值,GO語(yǔ)言多維數(shù)組,GO語(yǔ)言切片等知識(shí)點(diǎn)需要的朋友可以參考下2022-12-12如何使用工具自動(dòng)監(jiān)測(cè)SSL證書(shū)有效期并發(fā)送提醒郵件
本文介紹了如何開(kāi)發(fā)一個(gè)工具,用于每日檢測(cè)SSL證書(shū)剩余有效天數(shù)并通過(guò)郵件發(fā)送提醒,工具基于命令行,通過(guò)SMTP協(xié)議發(fā)送郵件,需配置SMTP連接信息,本文還提供了配置文件樣例及代碼實(shí)現(xiàn),幫助用戶輕松部署和使用該工具2024-10-10

win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開(kāi)發(fā)