Go GOPATH 模式未來會怎么樣,會消失嗎?
大家好,我是煎魚。
還記得好多年前,我們才剛剛開始學習和使用 Go 這一門編程語言。當時依賴管理還在用 GOPATH 模式,為此大家基于此去開發(fā)和管理了很多配套工具和流程。
隨著 Go 模塊管理(Module)的成熟,有在用新的,有在用舊的。GOPATH 的去留成為了一個折騰的問題。
GOPATH 存在的問題
現(xiàn)階段 Go 維護既有的 GOPATH 模式,至少存在兩個重要問題:
- 新特性更不上:在模塊代理、校驗和數(shù)據(jù)庫等安全改進方面,舊的 GOPATH 模式已被拋在后面。Go 所有的迭代焦點都集中在模塊管理(go.mod)上。
- 無法識別版本:舊的 GOPATH 模式的源代碼布局,沒有提供識別當前使用的 Go 語音版本的方法。
第一點還能說可以用,不跟進,似乎也沒什么大問題。最煩的是第二點,之前在 GOPATH 和 Go Module 并立的年代。經常會遇到這個痛苦的坑。
這里 Go 程序讀取模塊會有一些分歧:
- Module 模式的程序,讀取 go.mod 的 go 行,確定版本為 Go 1.16。
- GOPATH 模式的程序,由于無法得知版本,只能假設 Go 是最新版本。
這意味著,如果有人在 GOPATH 模式下開發(fā)了可下載的軟件包,他們可以使用 Go 1.16 之后引入的語言特性,比如泛型。但當用戶在 Module 模式下以模塊的形式下載這些代碼時,這些代碼會被解釋為 Go1.16,無法編譯。
隨著時間的推移,其他語言特性或變更的出現(xiàn),這種分歧會越來越大。
曾經的最后通牒
之前在 2021 年 2 月時,在 Go 官方博客上曾經對此作出公示,給出最后的通牒:
圖片
- 可以通過將 GO111MODULE 環(huán)境變量設置為 off,仍然可以繼續(xù)在 GOPATH 模式下構建包。
- 我們計劃在 Go1.17 中放棄對 GOPATH 模式的支持。
- Go1.17 將忽略 GO111MODULE 環(huán)境變量。如果有未在模塊模式下構建的項目,現(xiàn)在是遷移的時候了。
從結果來看,現(xiàn)在 2024 年了,大家也知道了,Go1.17 及以后也沒有放棄 GOPATH 模式。最后通牒是可以被打破的!
最終采取的策略和行動
- 承諾無限期保留 GO111MODULE=off 時,構建 GOPATH 布局源代碼樹的功能。
- 在 GOPATH 模式下完全禁用 go get,因為它能成功下載的代碼越來越少,帶來的開發(fā)體驗也越來越差。
- 在 GOPATH 模式下,將把 Go 語言版本假設為 Go1.21,而不是繼續(xù)假設為 “最新的 Go 版本”。這將確保如果在 Go 1.22 中更改 for 循環(huán)或在將來進行其他重大更改時,達到舊版代碼也能繼續(xù)編譯的目的。
總結
這次針對 GOPATH 模式和 Module 模式的探討和推進,仍然是由 Go 核心團隊負責人 rsc 負責發(fā)起。最終的結論是 GOPATH 模式這種歷史債務甩不掉,還是有人必須要使用的。但是我們也不能完全不管他。
答案是既要也要還要。所以對 GOPATH 模式和 Module 模式同時做了一些小處理,避免造成過大的沖突。最終結論是:無限期保留基本 GOPATH 模式的支持。此項變更在 Go1.22 時已經生效!