小王刚接手公司内部管理后台的更新工作,每次上线都要手动把编译好的 dist 文件夹拖进服务器,再一层层 cd 进目录、覆盖旧文件、重启服务……光是复制文件就容易手抖点错,一不小心就把 config.json 覆盖了,结果页面全白屏。后来他写了个 5 行 shell 脚本,以后双击运行,3 秒完事。
为什么非得用脚本复制文件?
人工复制看着简单,但项目一多就乱套:漏传、误删、路径写反、权限没改……部署脚本不是炫技,是把重复动作固化下来,让“复制文件”这件事不再靠记忆和运气。
Windows 上用批处理快速复制
比如要把本地 D:\myapp\build\* 全部推到远程服务器 \\192.168.1.100\webroot\myapp\,建个 deploy.bat 就行:
@echo off
xcopy "D:\myapp\build\*" "\\192.168.1.100\webroot\myapp\" /E /Y /I
echo 文件已同步完成
pause/E 表示包含子目录,/Y 自动确认覆盖,/I 假设目标不存在时创建目录。双击运行,比开资源管理器拖拽还快。
Linux/macOS 更常用 rsync
运维或前端同学更爱 rsync —— 它只传变化的文件,断网重连也不怕。假设你本地有 ./dist/,要同步到云服务器的 /var/www/myapp/:
#!/bin/bash
rsync -avz --delete ./dist/ user@192.168.2.5:/var/www/myapp/
ssh user@192.168.2.5 'chown -R www-data:www-data /var/www/myapp/'其中 -a 保留权限和时间戳,-v 显示过程,-z 压缩传输,--delete 清理目标端多余文件(慎用,先测试)。后面那行 ssh 是顺手改下 Web 目录权限,免得 PHP 或 Nginx 报 403。
Node.js 脚本也能干这事
如果你的项目本身用 Node,直接在 package.json 里加个脚本更省事:
"scripts": {
"deploy": "node deploy.js"
}然后新建 deploy.js:
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const src = path.join(__dirname, 'dist');
const dest = '/var/www/myapp';
exec(`rsync -avz ${src}/ ${dest}/`, (err) => {
if (err) console.error('同步失败:', err);
else console.log('✅ 已发布到服务器');
});执行 npm run deploy,跟跑测试一样自然。
部署脚本不是大厂专利,小团队、个人项目、甚至学生交作业——只要需要反复把文件从 A 搬到 B,它就能省下你每天几分钟,一年就是几十小时。关键不在多复杂,而在“这次改了哪几行,下次别再手抖”。