1、先安装两依赖包,archiver 是用来压缩dist文件,node-ssh用来和ssh链接登录以及命令的执行。
npm install node-ssh archiver --save
2、在根目录建一个文件,我这里给它取名upload.js
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const { NodeSSH } = require('node-ssh');
// 设置本地dist文件路径
const distPath = path.resolve(__dirname, '../dist');
const ssh = new NodeSSH();
// 获取远程服务器配置信息 此处建议通过配置文件获取
const config = {
host: 'x.x.x.x',
pathUrl: '/x/x/x', // 远程存放发布文件的地址
};
// =============第一步===========本地文件压缩
const zipDirector = () => {
const output = fs.createWriteStream(`${__dirname}/../dist.zip`);
const archive = archiver('zip', {
zlib: { level: 3 }, // 压缩层级
}).on('error', (err) => {
throw err;
});
output.on('close', (err) => {
if (err) {
console.log('压缩错误:', err);
return;
}
uploadFile();
});
output.on('end', () => {
console.log('output.on:end');
});
archive.pipe(output);
archive.directory(distPath, '/dist');
archive.finalize();
};
// =============第二步===========将本地压缩包文件上传至远程服务器
function uploadFile() {
ssh.connect({
host: config.host,
username: 'xxxx', //用户名
privateKey: `C:/Users/xxxx/.ssh/id_rsa`, //本地存放私钥的文件地址
port: 22 //端口号
}).then(() => {
// SSH链接成功,将dist压缩包上传至远程服务器的指定地址
ssh.putFile(`${__dirname}/../dist.zip`, `${config.pathUrl}/dist.zip`).then(() => {
updateFile();// 上传成功后执行远程服务器上的.sh脚本
}).catch((err) => {
console.log('上传失败:', err);
process.exit(0);
});
}).catch((err) => {
console.log('SSH链接失败:', err);
process.exit(0);
});
}
// =============第三步===========执行远程部署命令
const updateFile= () => {
// ssh.execCommand 在指定文件夹下执行了命令 sh unzip.sh
// unzip.sh对上传的压缩包进行解压
ssh.execCommand('sh unzip.sh', { cwd: config.pathUrl }).then((result) => {
if (!result.stderr) {
console.log('success!');
process.exit(0);
} else {
console.log('Something wrong:', result);
process.exit(0);
}
});
};
zipDirector();
3、远程服务器unzip.sh文件将原来的assets文件夹和index.js文件删除。再将dist压缩包解压出来。具体执行代码自行查阅。
4、在package.json文件中添加命令
"scripts": {
...
"build-dev": "vue-cli-service build --mode=dev",
"deploy-dev": "npm run build-dev && cross-env NODE_ENV=dev node ./upload.js",
},