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


































