Go1.25 新特性:Modules 將支持忽略機(jī)制!
大家好,我是煎魚。
Go 的模塊依賴管理(Go modules),雖然已經(jīng)推出了許多年。但一直存在著許多問題點(diǎn)和可以提高的空間。
今天給大家?guī)矸窒淼氖?Go1.25 中將會對此做的一個(gè)較為實(shí)用的功能特性說明。
問題背景
在多語言的項(xiàng)目中,使用 Go modules 或相關(guān)工具鏈(例如:gopls)時(shí)會有一些令人頭疼的問題點(diǎn)。
如下問題點(diǎn):
- 在大型的多語言項(xiàng)目中(如:包含 node_modules、Bazel 構(gòu)建輸出等目錄),使用命令如
go list ./...,go test,go vet時(shí),Go 工具鏈會遍歷所有目錄,即使很多目錄與 Go 無關(guān),導(dǎo)致執(zhí)行緩慢。 - gopls 在這些項(xiàng)目中索引無關(guān)目錄,造成 CPU 和內(nèi)存高耗,影響 IDE 性能。
- 如果被忽略的目錄中帶有示例
.go文件,go mod tidy會意外將它們納入模塊依賴,破壞模塊一致性。
在大型的多語言項(xiàng)目中都稍顯劣勢。因?yàn)橐坏┏霈F(xiàn)類似的場景,gopls 通常會占用 VSCode 中的大量 CPU 資源。同時(shí)我的印象中 GoLand 建立索引就比較費(fèi)時(shí)間。
社區(qū)自救
另辟蹊徑
Go 社區(qū)中的組件,例如:goimports 已有各種臨時(shí)方案。
例如:在目錄中放空 go.mod,使用工具特定 ignore 設(shè)置,如 gopls.directoryFilters 或 .goimportsignore)。
但這些方法不統(tǒng)一且不易共享管理,且會造成 Go 模塊依賴管理的生態(tài)碎片化,是不太好的。
借助標(biāo)準(zhǔn)(都被拒絕)
Go 社區(qū)在 issues 中其實(shí)討論過多種方案。畢竟首先利用現(xiàn)有功能特性,有助于快速解決問題。但很可惜都被拒絕了。
具體如下:
1、使用 go.mod 文件指定要忽略的目錄:
一開始被拒絕了,后面反水了。理由是因?yàn)?nbsp;go.mod 并非像 NodeJS 中的 package.json 那樣通用的配置文件。
2、使用單獨(dú)的 .goignore 文件:
被拒絕。理由是這與 Rob 希望避免新增點(diǎn)文件的意愿相悖,盡管與其他工具(如 .dockerignore、.gitignore、.bazelignore 等)保持一致,但仍存在顧慮。擔(dān)心增加新的頂級配置文件違背 Go 社區(qū)傳統(tǒng)。
Go1.25 新特性:在 go.mod 中新增 ignore 指令
在 Go1.25 新特性中,將會正式支持在 go.mod 文件中使用 ignore 指令引用目錄,來忽略某些目錄。
圖片
例子介紹
示例的 go.mod 代碼如下:
ignore (
./node_modules
./bazel?out
build_cache
)支持兩種路徑語法:
./directory_name:模塊根目錄下的特定路徑。例如:ignore ./foo/bar。directory_name(無需使用./):模塊內(nèi)部任意位置的匹配目錄名稱及其子目錄。例如:ignore foo。
注意事項(xiàng)
1、版本的要求上,在 go1.25 開始生效,會借助到 go.mod 中的 go 行版本進(jìn)行識別。并會確保滿足 Go 之前的兼容性保障措施。
2、另外在該 ignore 指令中,有些內(nèi)容物需要特別注意:
- 被忽略的目錄在構(gòu)建和分析過程中被視作以 _ 或 . 開頭的隱藏文件夾:
不會匹配 ./... 等包通配符。
gopls 和其他基于 go list 的工具將跳過掃描這些目錄。
- 即使忽略目錄中的內(nèi)容仍會被包含進(jìn)模塊壓縮包(zip)中,以避免校驗(yàn)和、代理一致性問題。
總結(jié)
這個(gè)新的提案已經(jīng)確定將在 Go1.25 釋出,官方文檔也已經(jīng)修改。后續(xù)我們將可以在 go.mod 文件中通過 ignore 指令管理不需掃描或構(gòu)建的目錄。
新版本發(fā)布后,將有效幫助到一些大型和多語言項(xiàng)目中的 Go 開發(fā)者。
尤其是正在處理多語言或有大量自動(dòng)生成目錄的 Go 倉庫,值得在 go.mod 中嘗試添加 ignore 指令。有可能有意想不到的性能提高。



































