如果在 Mac 上的 VS Code 中保存生成的文件总会导致其内容被更改,首先请确认正在运行的是哪个格式化程序。VS Code 的 editor.formatOnSave 设置会在保存文件时应用格式化,但 VS Code 并未提供内置的路径匹配模式来让选定的文件豁免该设置。对于 Prettier 等格式化程序,请使用其自带的忽略文件;否则,请在与需要保护的文件相匹配的作用域内关闭保存时格式化。
查明导致文件更改的原因
VS Code 可以通过 editor.formatOnSave 在保存时进行格式化,并且语言扩展也可以提供格式化程序。保存时的代码操作(Code Action,例如组织导入)属于独立的设置,同样可能会更改文件内容。VS Code 的编辑文档中介绍了保存时格式化;其保存时的代码操作指南则涵盖了保存时操作。
要缩小排查范围,请打开生成的文件,在状态栏中检查其语言模式,并在“设置”中搜索 formatOnSave 和 codeActionsOnSave。设置中的 @modified 筛选器有助于查看已配置的值。如果关闭格式化后文件仍发生更改,请检查已安装的扩展和项目脚本:可能是生成工具或另一个保存操作所致。仅禁用格式化无法阻止独立工具重写文件。
使用 Prettier 时排除生成路径
如果使用的格式化程序是 Prettier,请在项目根目录下的 .prettierignore 中添加生成文件的路径。例如,要跳过 src/generated 下生成的文件,请使用以下条目:
src/generated/
Prettier 文档将 .prettierignore 说明为其文件排除机制,并指出编辑器集成可以使用该机制。其匹配模式采用 Git-ignore 语法。如果您希望 Prettier 处理的其他文件继续保持保存时格式化,这是最具针对性的选择。请检查为该文件选择的格式化程序是否确实是 Prettier;其他格式化程序可能会使用不同的规则或忽略控制项。Prettier: 忽略代码
在合适的 VS Code 作用域中禁用格式化
在 Mac 上,按下 ⇧⌘P 并运行 Preferences: Open User Settings (JSON) 进行全局更改,或运行 Preferences: Open Workspace Settings (JSON) 仅影响当前项目。工作区文件保存在项目的 .vscode 文件夹中。VS Code 在用户和工作区设置中记录了这两种设置作用域及其 Mac 快捷命令。
要仅在当前工作区中停止保存时格式化,请将以下设置添加到其现有的 JSON 对象中。请保留现有的其他设置,并在需要处添加逗号:
{
"editor.formatOnSave": false
}
如需针对某种语言进行全局豁免,可将该设置的作用域限定为该语言。将 typescript 替换为文件的实际 VS Code 语言标识符(可从状态栏中查看):
{
"[typescript]": {
"editor.formatOnSave": false
}
}
这会在所选作用域内禁用该语言所有文件的保存时格式化,而不仅仅是生成路径下的文件。更具体的作用域也会覆盖相关设置,因此如果文件仍发生更改,请搜索 @modified 并检查用户设置、工作区设置以及任何特定语言的代码块。VS Code 的设置参考文档中介绍了特定语言的设置和优先级。
分开检查保存时操作
如果格式化已关闭,但保存时仍会重新排列导入或应用修复,请查找 editor.codeActionsOnSave。它控制诸如组织导入和全部修复等操作。仅需移除或更改导致重写的操作即可;全盘禁用此设置可能会同时移除有用的保存时行为。VS Code 的保存时的代码操作文档中解释了支持的控制项。
请勿将 files.exclude 用作格式化防范措施:VS Code 文档明确指出它是资源管理器可见性设置,而不是控制格式化程序是否编辑文件的设置。如果格式化程序没有基于路径的忽略功能,且仅影响少数生成的文件,实用的 VS Code 方案是针对其所属语言或工作区禁用保存时格式化,然后在需要时通过 Format Document (⇧⌥F) 手动格式化普通文件。VS Code 在基本编辑中记录了该命令。
对于必须保持逐字节完全一致的生成文件,如果格式化程序自身提供了有文档说明的忽略机制,应优先使用该机制。否则,请使用尽可能窄的 VS Code 设置作用域,然后保存一个具代表性的生成文件并检查 diff,以确认具体是哪项行为导致了修改。