vscode 保存文件时自动上传到远程服务器依赖 vscode-sftp 插件的 uploadonsave 配置,需在项目根目录创建 .sftp.json 并正确设置 remotepath、认证方式及路径权限。

VSCode 保存文件时自动上传到远程服务器,靠的是 sftp 插件的 uploadOnSave 配置
这不是 VSCode 原生功能,必须装插件。最稳定、维护活跃、配置直观的是 vscode-sftp(作者:liximomo)。它不依赖外部命令行工具(比如 rsync 或 scp),纯 Node.js 实现,适合轻量部署场景。
常见错误现象:保存后没反应、报错 "Cannot read property 'length' of undefined"、上传了但路径不对,文件出现在服务器根目录。
- 必须在项目根目录下新建
.sftp.json(不是sftp.json,也不是放在用户设置里) -
uploadOnSave必须设为true,且不能被watcher或autoUpload混淆——后者是旧版字段,新版已弃用 -
remotePath是关键:它定义你本地项目“对应”服务器上的哪个目录,不是绝对路径拼接起点;例如本地是/Users/me/project/,remotePath: "/var/www/html",那么src/index.js就会传到/var/www/html/src/index.js - 如果服务器路径权限不足(比如非
www-data用户但目标目录属主是www-data),上传会静默失败或报permission denied—— 此时要确认username能否写入该路径
sftp 插件连接失败:常见认证和路径问题
连不上基本就三类原因:密钥格式不对、用户名/密码填错、远程路径不存在或不可写。插件不会帮你创建远程目录,remotePath 必须提前存在。
- 用私钥登录时,
privateKeyPath填的是本地路径,比如"~/.ssh/id_rsa",但 VSCode 不展开~,得写成"/Users/me/.ssh/id_rsa"或"C:\Users\me\.ssh\id_rsa" - 如果服务器禁用了密码登录(只允许密钥),而配置里还写了
password字段,插件会优先尝试密码并失败,删掉password字段即可 -
host别写ssh://user@host,只写host值,如"192.168.1.100";端口用port单独配,默认 22 - 首次连接可能弹出「是否信任该主机」提示,关掉 VSCode 再重开有时能触发——这是底层
ssh2库的行为,不是插件 bug
避免覆盖生产文件:uploadOnSave 的作用范围很窄
它只对当前工作区(workspace)根目录下的文件生效,不会递归监听子目录以外的路径,也不会上传 node_modules、.git 这类文件夹——这点比手动 rsync 安全,但容易误以为“整个项目都同步了”。
- 如果项目是多根工作区(multi-root workspace),每个文件夹需单独配自己的
.sftp.json -
ignore字段可排除文件,但只支持 glob 模式,比如"**/*.log"或"dist/**";注意不能写正则 - 修改
.sftp.json后不用重启 VSCode,但必须保存该文件才能让新配置生效 - 没有“增量 diff 上传”,每次都是全量覆盖单个文件——所以别拿它当 Git 替代品,也别指望它跳过未修改的文件节省带宽
Windows 下路径分隔符和编码容易引发乱码或 404
本地用反斜杠 ,服务器用正斜杠 /,插件内部会转换,但如果你在 remotePath 里手抖写了 "C:/www",它真会试图传到服务器的 C:/www 目录(Linux 上当然不存在)。
- 统一用正斜杠
/写所有路径,包括remotePath和privateKeyPath - 如果服务器是 Linux,但文件名含中文,上传后显示乱码,大概率是服务器 locale 不是
UTF-8;检查locale输出,必要时在.bashrc加export LANG=en_US.UTF-8 - Windows 用户尤其注意:不要把项目放在 OneDrive 或 WSL 路径下,
sftp插件偶尔会因文件句柄异常卡住上传,表现为“正在上传…”一直转圈
真正麻烦的从来不是配通,而是改完配置后忘了删掉测试用的 console.log 就直接上传到线上——uploadOnSave 不区分开发/生产环境,它只认当前打开的文件。











