files.readonlyinclude是vscode 1.80+唯一有效的只读配置项,需以对象形式配置glob路径并设值为true;仅此配置不能真正阻止修改,必须叠加系统级只读权限(如chmod 444或windows属性勾选)才能实现防误改。

files.readonlyInclude 是唯一有效的配置项
VSCode 1.80+ 版本已彻底移除 files.readonly,现在只认 files.readonlyInclude。它是一个对象型配置,键为 glob 路径模式,值必须为 true;写成数组或布尔值都会被忽略。
- 正确写法:
"files.readonlyInclude": { "**/package-lock.json": true, "**/.env*": true } - 错误写法:
"files.readonly": ["**/.env"](直接被忽略,无报错) - 路径必须相对于工作区根目录,比如项目结构是
src/core/config.ts,要匹配就得写"**/core/**/*.ts",单星号*只匹配一级子目录 - 修改后需关闭所有已打开的匹配文件,再重新打开才生效——不会热更新
为什么右下角显示 “Read-only” 却还能保存成功
这说明只启用了视觉提示,没真正拦截写入。根本原因通常是两个配置没配齐:
-
files.saveWithoutWatching默认为true,会绕过只读检查直接尝试写入 - 文件本身没设系统级只读权限(如
chmod 444或 Windows 属性勾选“只读”)
验证是否真生效:关闭文件标签页 → 重新打开 → 按 Ctrl+S,必须弹出 Unable to write file 'xxx' (NoPermissions) 才算到位。
系统级只读才是防绕过的最终防线
files.readonlyInclude 只禁用保存按钮和快捷键,但不阻止编辑行为——你能输入、删改、粘贴,只是点保存时才拦。要彻底锁死,必须叠加操作系统权限:
- Windows:右键文件 → “属性” → 勾选“只读” → 点“应用”,并勾选“将更改应用于此文件夹、子文件夹和文件”
- macOS/Linux:终端执行
chmod 444 /path/to/file.ts(注意不是644,444表示仅读) - Git 仓库中文件权限可能被
git checkout重置,需同步执行git config core.filemode false - 别对整个
node_modules目录设chmod 444——目录权限设只读无效,且会破坏包管理器逻辑
常见误配与路径陷阱
glob 匹配看似简单,实际极易写错:
-
"*.log"只匹配当前目录下的 log 文件,不递归;要全项目生效得写"**/*.log" -
"src/**/index.ts"匹配src/a/index.ts和src/a/b/index.ts,但不匹配src/index.ts(因为中间必须有至少一层目录) -
"**/core/**/*.{ts,js}"是合法写法,支持扩展名枚举;但不支持正则,只认 minimatch 语法 - 多根工作区下,路径匹配以当前「活动的」工作区根为准,不是所有根的并集
真正难的不是写配置,而是让开发者习惯每次改完 settings.json 后手动重开文件——VSCode 不会主动 reload 已打开的只读匹配项,这点最容易被忽略。











