sftp插件“保存自动上传”失效的根本原因是remotepath配置错误或本地路径映射不明确;必须确保打开整个项目文件夹、localpath为相对路径、remotepath末尾无斜杠、uploadonsave置于顶层且日志显示uploaded。

为什么 SFTP 插件的“保存自动上传”经常失效
根本原因不是插件坏了,而是 remotePath 配置错误或本地路径映射不明确。VSCode 的 sftp 插件(Remote - FTP 或 SFTP by liximomo)不会全局监听所有文件,它只对当前工作区中已配置了 config.json 的文件夹生效,且必须满足“本地路径能被准确映射到远程路径”的前提。
常见错误现象:File saved, but not uploaded 日志反复出现;手动右键 Upload file 能成功,但 Ctrl+S 没反应;部分文件上传,部分不传。
- 确保你在 VSCode 中打开的是**整个项目文件夹**(不是单个文件),否则插件找不到
.vscode/sftp.json -
localPath必须是相对于工作区根目录的路径,不能写成绝对路径(如C:\project\src) -
remotePath末尾不要加斜杠(/var/www/html/❌ →/var/www/html✅) - 如果用的是
sftp插件 v1.12.9+,需确认"uploadOnSave": true在sftp.json顶层,而非嵌套在config数组里
sftp.json 关键字段怎么填才真正触发自动同步
这个配置文件必须放在 .vscode/sftp.json(注意是 .vscode 文件夹下,不是用户级设置)。核心字段不是越多越好,而是要精准匹配你的编辑场景。
{
"name": "prod-server",
"host": "192.168.1.100",
"port": 22,
"username": "deploy",
"password": "",
"privateKeyPath": "/path/to/id_rsa",
"remotePath": "/var/www/myapp",
"uploadOnSave": true,
"watcher": {
"files": "**/*",
"autoUpload": true
}
}
-
remotePath是你希望所有保存的文件都映射到服务器上的**基准路径**,比如你编辑src/api/user.ts,它就会传到/var/www/myapp/src/api/user.ts - 删掉
protocol字段(插件 v1.12+ 已废弃,留着反而报错Unknown protocol: sftp) -
watcher不是必需项,但加上后可补救某些 IDE 缓存导致的上传延迟;files用**/*表示监听全部,别写成*.ts—— 否则 .html 改了不上传 - 密码为空时必须保留
"password": "",不能删掉该字段,否则插件会卡在认证环节
保存没同步?先查这三处日志和状态
插件不报错 ≠ 正常运行。很多同步失败是因为连接建立后立刻断开,或者权限拒绝但被静默吞掉。
- 打开 VSCode 命令面板(Ctrl+Shift+P),运行
SFTP: Open Log,保存一个文件,看最后几行是否出现UPLOADED或ERROR—— 这是最准的依据 - 右下角状态栏检查是否有
SFTP [prod-server]字样,且图标是绿色连通状态;灰色或红色说明连接未就绪 - 如果日志里有
Permission denied (publickey),不是密钥路径错,而是服务器上~/.ssh/authorized_keys没写对,或sshd_config中PubkeyAuthentication yes未启用
Windows 本地路径含空格或中文时同步失败怎么办
这不是 bug,是底层 Node.js 的 ssh2 库对路径编码处理不一致导致的。尤其当你 localPath 是 我的项目/src 或 My Project/src 时,插件生成的上传路径会被截断或转义异常。
- 最稳解法:把项目移到无空格、无中文路径下,例如
D:/work/myapp - 次选方案:在
sftp.json中显式指定localPath(虽然文档说可省略),值写成相对路径"localPath": "./",强制以工作区为起点解析 - 避免使用 Windows 风格反斜杠
\,全用正斜杠/(连privateKeyPath也要写成C:/Users/me/.ssh/id_rsa)
自动同步本身不复杂,难的是路径映射那层“看不见的约定”。一旦 localPath 和 remotePath 的相对关系没对齐,插件就只能猜——而它通常猜错。











