vue-cli项目根目录新建run_bulid.js文件
安装依赖
npm i compressing ssh2 --save-dev
run_bulid.js
const {exec} = require('child_process');
const compressing = require('compressing');
const Client = require('ssh2').Client;
// 服务器文件地址
const server_url="/usr/local/nginx/html/";
//服务器列表
const server=[
{
nm:"服务器1",//服务器名称(自定义)
sv:{
host: '', // 服务器地址
port: '', // 端口号
username: '', // 用户名
password: '' // 密码
},
}
,
{
nm:"服务器2",//服务器名称(自定义)
sv: {
host: '', // 服务器地址
port: '', // 端口号
username: '', // 用户名
password: '' // 密码
},
}
]
let server_key=0;
function conn() { // 连接服务器
var connect = new Client()
var name=server[server_key].nm
console.log('========连接服务器'+name+'========')
connect.on('ready', () => {
console.log('========连接'+name+'成功========')
upload(name,connect)
}).on('error', (err) => {
console.error(err)
console.log('========连接'+ name +'出错========')
}).on('end', () => {
console.log('========连接'+ name +'关闭========')
if(server[server_key+1]&&name){
server_key++;
conn()
}
}).on('close', (err) => {
if (err) {
console.log('========连接'+name+'出错========')
}
}).connect(server[server_key].sv)
}
function upload(name,connect) { // 上传
console.log('========'+name+'开始上传========')
connect.sftp((err, sftp) => {
if (err) throw err
// 第一个参数为要上传的文件名, 第二个参数为服务器目录
sftp.fastPut('dist.zip', server_url+"dist.zip", (err, res) => {
if (err) {
console.log(err)
console.error('========'+name+'上传失败========')
connect.end()
return
}
console.log('========'+name+'上传成功========')
unzipShell(name,connect)
})
})
}
function unzipShell(name,connect) { // 服务器解压命令
connect.shell((err, stream) => {
console.log('========'+name+'解压中========')
if (err) throw err
let buf = "";
stream.on('close', err => {
connect.end()
if (err) {
console.error(err)
return
}
console.info('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
console.info('======== '+name+'SUCCESS!! ========')
console.info('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
}).on('data', data => {
buf += data
console.log(buf)
})
// 服务器端的命令行运行
// 主要就是到目录下解压文件后复制到上一层
// 再删除掉解压出来的文件夹
stream.write('cd '+server_url+' && unzip dist.zip \nnext\n')
stream.write('cd dist && /bin/cp -r -f * ../ \nnext\n')
stream.write('cd ../ && rm -r -f dist \nexit\n')
})
}
function compress() { // 压缩命令
console.log('======== 压缩中======== ')
// 此处第一个参数为要打包的目录, 第二个参数是打包后的文件名
compressing.zip.compressDir('dist/', 'dist.zip').then(() => {
console.log('======== 压缩成功======== ')
conn()
})
}
console.log('========打包中========')
// 运行 'npm run build' 命令
const bat = exec('npm run build', (err, stdout, stderr) => {
if (err) {
console.error(`exec error: ${err}`);
return;
}
console.log('========打包成功========')
compress()
})
执行文件
node run_bulid
踩坑
服务器执行解压命令时可能会出现命令不存在的情况,自行百度教程安装unzip命令