Golang 1.16 已經(jīng)正式發(fā)布了,其中 Modules 有一些變化:
golang 1.16 默認(rèn)開啟 Modules,即使不存在go.mod
,Go 命令現(xiàn)在默認(rèn)情況下也會(huì)在module-aware
(模塊感知)模式下構(gòu)建包。
在 golang 1.16 中,通過設(shè)置關(guān)閉GO111MODULE
環(huán)境變量,在GOPATH
模式下構(gòu)建包仍然是可能的。您還可以將GO111MODULE
設(shè)置為auto
,以便在當(dāng)前目錄或任何父目錄中存在go.mod
文件時(shí)啟用module-aware
(模塊感知)模式。您還可以使用go env -w
永久設(shè)置GO111MODULE
和其他變量,:
goenv-wGO111MODULE=auto
Go 官方計(jì)劃在Go 1.17
中放棄對(duì)GOPATH
模式的支持。換句話說,Go 1.17
將忽略GO111MODULE
。如果您的項(xiàng)目不在module-aware
(模塊感知)模式下構(gòu)建,則現(xiàn)在是時(shí)候遷移至module-aware
(模塊感知)模式了。
在 golang 1.16 之前版本中,當(dāng) go 命令發(fā)現(xiàn)go.mod
或go.sum
存在問題時(shí),如缺少require
指令或缺少sum
,它將嘗試自動(dòng)解決問題。Go 官方收到很多反饋,這種行為是令人驚訝的,特別是對(duì)于 go 命令,如go list
,通常沒有副作用。自動(dòng)修復(fù)并不總是可取的:如果任何所需模塊不提供導(dǎo)入的包,Go 命令將添加新的依賴項(xiàng),可能觸發(fā)常見依賴項(xiàng)的升級(jí)。即使輸入路徑拼寫錯(cuò)誤,也會(huì)導(dǎo)致(失敗的)網(wǎng)絡(luò)查找。
在 golang 1.16 中,module-aware
(模塊感知)命令在go.mod
或go.sum
中發(fā)現(xiàn)問題后報(bào)告錯(cuò)誤,而不是嘗試自動(dòng)解決問題。在大多數(shù)情況下,錯(cuò)誤消息中列出建議命令來解決問題,例如:
$ go build example.go:3:8: no required module provides package golang.org/x/net/html; to add it: go get golang.org/x/net/html $ go get golang.org/x/net/html $ go build
golang 1.16 與 Go 之前版本一樣,如果vendor
目錄存在,Go 命令可能會(huì)使用vendor
目錄。go get
和go mod tidy
命令仍然修改go.mod
和go.sum
,因?yàn)樗麄兊闹饕康氖枪芾硪蕾囮P(guān)系。
go install
命令現(xiàn)在可以通過指定@version
后綴安裝特定版本的可執(zhí)行文件,例如:
go install golang.org/x/tools/gopls@v0.6.5
如果使用@version
后綴,go install
命令使用該確切 Module 版本,忽略當(dāng)前目錄和父目錄中的任何go.mod
文件中的 Module 版本。
如果沒有@version
后綴,go install
繼續(xù)運(yùn)行,因?yàn)樗恢庇?,建立程序使用?dāng)前模塊的go.mod
文件中 requirements 列表和 replacements 列表列出的版本。
為了消除使用哪個(gè)版本的模糊性,在使用此安裝語法go install program@latest
時(shí),Go 程序的 go.mod 文件中可能存在幾個(gè)限制的指令。特別是,至少目前不允許replace
和exclude
指令。從長遠(yuǎn)來看,一旦新的go install program@version
在大多數(shù)使用情況下工作的很好的前提下,Go 官方計(jì)劃在未來某個(gè)版本中讓go get
命令停止安裝二進(jìn)制文件。
您是否在模塊版本準(zhǔn)備好之前意外地發(fā)布了該版本?或者,您是否在發(fā)布需要快速修復(fù)的版本后發(fā)現(xiàn)了問題?已發(fā)布版本中的錯(cuò)誤很難更正。為了保持模塊生成的確定性,版本發(fā)布后無法修改。即使您刪除或更改了版本標(biāo)簽,proxy.golang.org
和其他代理可能已經(jīng)有原始緩存。
模塊作者現(xiàn)在可以使用go.mod
中的retract
指令 retract 模塊版本。retract 的版本仍然存在,可以下載(因此依賴于它的構(gòu)建不會(huì)中斷),但 go 命令在解決@latest
等版本時(shí)不會(huì)自動(dòng)選擇它。go get
和go list -m -u
會(huì)打印有關(guān)現(xiàn)有用途的警告。
例如,假設(shè)一個(gè)流行的庫的作者example.com/lib
發(fā)布 v1.0.5,然后發(fā)現(xiàn)一個(gè)新的安全問題。他們可以添加指令到他們的go.mod
文件,例如:
//Remote-triggeredcrashinpackagefoo.SeeCVE-2021-01234.
retractv1.0.5
接下來,作者可以 tag 和 push 版本 v1.0.6,新的最高版本。在此之后,已依賴 v1.0.5 的用戶在檢查更新或升級(jí)依賴包時(shí)將收到撤回通知。通知消息可能包括收回指令上方注釋的文本。例如:
$ go list -m -u all example.com/lib v1.0.0 (retracted) $ go get . go: warning: example.com/lib@v1.0.5: retracted by module author: Remote-triggered crash in package foo. See CVE-2021-01234. go: to switch to the latest unretracted version, run: go get example.com/lib@latest
go 命令可以從鏡像proxy.golang.org
或直接從版本控制存儲(chǔ)庫下載模塊源代碼,使用 git、hg、svn、bzr 或 fossil。直接版本控制訪問很重要,尤其是對(duì)于代理上不可用的私有模塊,但它也可能是一個(gè)安全問題:版本控制工具中的錯(cuò)誤可能被惡意服務(wù)器利用來運(yùn)行惡意代碼。
Go 1.16 引入了一個(gè)新的配置變量 GOVCS,它允許用戶指定哪些模塊允許使用特定的版本控制工具。GOVCS 接受一個(gè)逗號(hào)分隔的模式列表:vcslist 規(guī)則。
模式是一條path.Match
。匹配模式匹配模塊路徑的一個(gè)或多個(gè)主要元素。公共和私有的特殊模式匹配公共和私有模塊(私有定義為與 GOPRIVATE 中的模式匹配的模塊;公共是其他一切模塊)。vcslist 是允許版本控制命令或關(guān)鍵字 all 或 off 的管道分隔列表。例如:
GOVCS=github.com:git,evil.com:off,*:git|hg
使用此設(shè)置,可以使用 git 下載帶有github.com
路徑的模塊;無法使用任何版本控制命令下載evil.com
上的路徑,使用 git 或 hg 下載所有其他路徑(*
匹配所有內(nèi)容)的模塊。
如果未設(shè)置環(huán)境變量 GOVCS,或者如果模塊與任何模式不匹配,Go 命令將使用 GOVCS 的默認(rèn)值:允許 git 和 hg 用于公共模塊,并且允許所有工具用于私有模塊。
設(shè)置只允許使用 Git 和 Mercurial 的理由是,這兩個(gè)版本控制工具最關(guān)注作為不受信任服務(wù)器的客戶端運(yùn)行的問題。相比之下,Bazaar、Fossil 和 Subversion 主要用于受信任的、經(jīng)過驗(yàn)證的環(huán)境中,而且沒有像 attack surfaces 那樣受到很好的審查。即默認(rèn)設(shè)置為:
GOVCS=public:git|hg,private:all
我們希望您發(fā)現(xiàn)這些功能很有用。我們已經(jīng)開始開發(fā) Go 1.17 的模塊功能,特別是懶惰的模塊加載,這應(yīng)該使模塊加載過程更快,更穩(wěn)定。
本文主要介紹了 Golang 1.16 針對(duì) Module 做的一些變化。通過 Go 官方的這些 Module 變化,切實(shí)解決了 Go 用戶在使用 Go 時(shí)的實(shí)際問題。Go 官方也表示會(huì)在 Golang 1.17 計(jì)劃徹底去除GOPATH
模式,所以,如果您的項(xiàng)目目前還沒有遷移到 Module 模式,是時(shí)候開始遷移了。
到此這篇關(guān)于Golang 1.16 中 Modules的主要變化更新的文章就介紹到這了,更多相關(guān)Golang Modules變化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:物業(yè)服務(wù) 遼寧 安康 青海 電子產(chǎn)品 儋州 海南 西雙版納
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang 1.16 中 Modules的主要變化更新》,本文關(guān)鍵詞 Golang,1.16,中,Modules,的,主要,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。