# 本地环境npm打包后自动传到服务器
# 背景
在开发js工具库的时候,需要单独打包。
而且使用该库的环境的代码是直接跑在服务器上的,所以每次修改工具库的代码后都需要手动传到服务器上,实在耗时,于是研究了一下,使用了一套本地打包后自动上传到服务器的流程。
# 实现
# npm 的命令钩子
写在npm scripts
中的命令,有前置钩子pre
和后置钩子post
,
这里需要在打包后做处理,使用的是后置钩子,代码如下
"build:deploy": "npm run build:umd",
"postbuild:deploy": "node ./build/deploy/deploy.js",
在打包后会自动触发postbuild:deploy
命令,执行deploy.js
# 上传
使用node-ssh
进行上传
链接到服务器,上传文件,上传后清下服务器缓存。
/**
* 打包后自动推送文件到服务器
*/
const { NodeSSH } = require('node-ssh');
const ssh = new NodeSSH();
const config = require('./config');
function uploadFile() {
ssh.connect({
host: config.host,
username: config.username,
password: config.password,
port: config.port
}).then(function () {
// 上传网站的发布包至config中配置的远程服务器的指定地址
ssh.putFile(config.localPath, config.remotePath).then(function(status) {
console.log('上传文件成功');
console.log('开始执行远端脚本');
startRemoteShell();// 上传成功后触发远端脚本
}).catch(err => {
console.log('文件传输异常:', err);
process.exit(0);
});
}).catch(err => {
console.log('ssh连接失败:', err);
process.exit(0);
});
}
// 执行远端部署脚本
function startRemoteShell() {
// 在服务器上cwd配置的路径下执行sh deploy.sh脚本来实现发布
ssh.execCommand('清缓存命令').then(function(result) {
// console.log('远程STDOUT输出: ' + result.stdout);
// console.log('远程STDERR输出: ' + result.stderr);
if (!result.stderr) {
console.log('发布成功!');
process.exit(0);
}
});
}
function start() {
uploadFile();
}
start();
config.js
/**
* config 存放的是连接远程机器的信息
*/
const path = require('path');
module.exports = {
host: 'x.x.x.x',
username: 'admin',
password: 'admin',
port: 8080,
remotePath: '服务器上存放上传文件的位置',
localPath: path.resolve(__dirname, '本地打包出的文件的位置')
};