vscode.workspace.fs.readFile 静默失败是因未在 package.json 的 capabilities 中声明 workspace 读写权限;必须显式配置 "workspace": { "read": true, "write": true },且路径授权按 URI 粒度独立申请。

vscode.workspace.fs.readFile 静默失败?先查 package.json 的 capabilities 声明
VSCode 1.86+ 版本起,vscode.workspace.fs.readFile 这类调用不会报 Permission Denied,而是直接抛 OperationNotSupportedError 或静默返回空——根本不是代码写错了,是插件没“要到权”。
必须在 package.json 的 capabilities 字段里显式声明能力,且格式严格:
-
"workspace": { "read": true, "write": true }是完整写法;"workspace": true已弃用,会被忽略 - 如果只读当前打开的文件,
"read": true足够;但凡涉及vscode.workspace.fs.writeFile或保存到用户选中的任意路径,"write": true不可省略 -
"untrustedWorkspaces": { "supported": false }若未声明,插件在受限工作区(如 GitHub Codespaces)会直接禁用
构造 Uri 时硬编码 C: 或 /mnt/c/ 路径?必然失败
VSCode 的路径授权是按完整 URI 粒度控制的:vscode.Uri.file('C:\temp\foo.txt') 和 vscode.Uri.file('C:\temp\bar.txt') 视为两个独立域,哪怕父目录相同。用户点了“允许”,子路径也不继承权限。
常见错误场景:
- 插件拼接路径:
vscode.Uri.file(path.join(os.homedir(), 'config.json'))→ 没触发授权弹窗,调用直接失败 - 在 WSL 中访问
/mnt/c/Users/xxx/project→ 即使声明了workspace,也因跨系统元数据缺失被拒绝 - 试图读
vscode.env.appRoot下的资源 → 可读,但vscode.Uri.file('C:\Windows\system32\hosts')永远失败,OS ACL 不允许绕过
正确做法:用 vscode.window.showOpenDialog 让用户主动选路径,返回的 Uri[] 自动获得该路径授权。
WSL 下坚持用 Node.js fs?文件属主和执行位全乱
在 WSL 中直接调 fs.readFileSync('/mnt/c/project/file.txt'),看似能读,但实际隐患极多:
- NTFS 不支持 Linux-style 权限位,
chmod +x在 WSL 中临时生效,从 Windows 侧保存后立即重置 - 文件属主常显示为
root:root,导致插件无法写入或监听变更(如 ESLint 不触发) - Git 报错 “unable to create file”,因为 WSL 无法正确映射 UID/GID
必须统一走 vscode.workspace.fs API —— 它内部做了跨系统元数据适配。同时确认 WSL 已启用 metadata:
编辑 /etc/wsl.conf,确保含以下内容:
[automount] enabled = true options = "metadata,uid=1000,gid=1000,umask=022"
改完重启 WSL:wsl --shutdown 再重新打开。
~/.vscode/extensions 目录不可写?90% 的插件安装失败根源
插件安装失败、更新卡在 “Installing…”、安装后重启消失——这些问题八成不是网络或 Marketplace 导致的,而是 ~/.vscode/extensions 目录当前用户无写权限。
验证方式:
- Linux/macOS:
ls -ld ~/.vscode/extensions,输出应含drwxr-xr-x且属主是你自己(不是root) - Windows:右键该目录 → “属性” → “安全” → 检查你的账户是否有“修改”和“写入”权限
- 若属主错误,执行:
sudo chown -R $USER:$USER ~/.vscode/extensions(Linux/macOS)
自定义插件路径(如 code --extensions-dir /path/to/dir)时,VSCode 不会自动创建目录或校验权限。务必手动 mkdir -p /path/to/dir && chmod 755 /path/to/dir 并用 touch /path/to/dir/test 测试可写性。
真正容易被忽略的是:capabilities 声明只是“申请权限的门票”,不是“万能钥匙”;用户点“允许”只对那个具体路径生效,下次换路径还得再申请——这是 VSCode 的安全设计,不是 bug,得按这个节奏来。


















