背景:手动敲打命令将打包文件发布到服务器的感觉很不爽,作为21世纪的90后,本着能懒则懒的原则,决定去实现打包后自动上传服务器的功能。
依赖:
scp2:一款使用JavaScript编写的基于SSH2的模拟实现
cross-env:跨平台设置和使用环境变量的脚本
安装依赖:
npm install scp2 --save-dev
npm install cross-env --save-dev
或
yarn add scp2 --save-dev
yarn add cross-env --save-dev
实现:
1.定义服务器信息:
const SERVER_INFO =
{
name: process.env.NODE_ENV === 'development' ? '测试环境' : '生产环境',
host: process.env.NODE_ENV === 'development' ? '192.x.x.x' : '192.x.x.x',// ip
port: 22,// 默认端口号
username: 'root', // 登录服务器的账号
password: 'xxxxxx',// 密码
localPath: './dist',
path: process.env.NODE_ENV === 'development' ? '/home/development/data/vue/project' : '/home/production/data/vue/project/',// 服务器存放项目路径
}
module.exports = SERVER_INFO;
2.编写配置代码
const scpClient = require('scp2');
const ora = require('ora');
const chalk = require('chalk');
const {SERVER_INFO: serverInfo} = require('./obtainEnv');
const enviro = serverInfo.name;
const spinner = ora(
`正在发布到${enviro}服务器...`
);
let Client = require('ssh2').Client;
let conn = new Client();
conn.on('ready', () => {
conn.exec('rm -rf '+ serverInfo.path + '/' + '*', (e, stream) => {
if (e) {
throw e
}
stream.on('close', (code, signal) => {
spinner.start();
scpClient.scp(serverInfo.localPath,
{
host: serverInfo.host,
username: serverInfo.username,
port: serverInfo.port,
password: serverInfo.password,
path: serverInfo.path,
},
(err) => {
spinner.stop();
if (err) {
console.log(chalk.red('发布失败.\n'));
throw err;
} else {
console.log(chalk.green(`Success! 成功发布到${serverInfo['name']}服务器!`));
}
});
conn.end();
}).stdout.on('data', (data) => {
console.log('STDOUT: ' + data);
}).stderr.on('data', (data) => {
console.log('STDERR: ' + data);
})
})
}).connect({
host: serverInfo.host,
port: serverInfo.port,
username: serverInfo.username,
password: serverInfo.password
})
3.package.json中加上命令代码:
4.执行
npm run dev-deploy 命令:
首先会执行npm run dev-build,将本地文件进行打包,再将打包后的文件上传到服务器上:
查看运行的输出结果,总耗时32.69s,是不是节省了很多时间成本了
注意点:
在发布之前执行rm -rf命令时,建议先拿一个测试文件进行测试,避免因路径错误,删除其他重要文件,否则,就跑路吧(rf: run fast),跑快点!
最后,喝酒烫头骑马蹦迪!!!