欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題

 更新時(shí)間:2023年09月18日 10:12:25   作者:love666666shen  
這篇文章主要介紹了go mod更新指定的tag的包后,go vendor內(nèi)容未更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

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)文章

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

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

    這篇文章主要介紹了win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開(kāi)發(fā),需要的朋友可以參考下
    2014-10-10
  • 最新評(píng)論