Vue自动构建发布脚本介绍使用cross-env,scp2两个插件完成cross-envcross-env这是一个跨平台设置运行的脚本,使用环境变量。为什么需要cross-env?NODE_ENV=production当你这样设置环境变量时,大多数Windows命令提示符都会卡住。(例外是Windows上的Bash,它使用本机Bash。)此外,Windows和POSIX命令使用环境变量的方式不同。对于POSIX,您可以使用:$ENV_VAR而在Windows上,您可以使用%ENV_VAR%。cross-env这样,您可以使用单个命令而不必担心为您的平台正确设置或使用环境变量。就像在POSIX系统上运行时一样,只需设置它,cross-env就会正常设置。scp2scp2是一个基于ssh2的纯javascript安全拷贝程序。ssh2主要由ssh2驱动,scp以某种sftp方式实现。它是用纯JavaScript编写的,可以在每个操作系统上运行,甚至是Windows。必须使用Nodejs(v0.8.7或更高版本)才能工作。在项目根目录安装,点击安装cnpminstallscp2--save-devcnpminstallcross-env--save-dev在根目录创建deploy文件夹,创建index.js(代码入口文件),products在deploy目录。js(配置文件和核心代码)。代码如下:index.js//deploy/index.jsconstscpClient=require('scp2');constora=require('ora');constchalk=require('粉笔');constserver=require('./products');constspinner=ora('发布到'+(process.env.NODE_ENV==='prod'?'production':'test')+'server...');varClient=require('ssh2').Client;varconn=newClient();conn.on('ready',function(){//rm删除dist文件,\n表示换行换行执行重启nginx命令我这里使用docker重启nginx//rm-rf/mdm/nginx/dist\ndocker重启nginxconn.exec(`cp-r/home/newResource/dist/./home/newResource/dist${newDate().toLocaleDateString().replace(/\//g,'-')}\nrm-rf/home/newResource/dist`,function(err,stream){if(err)throwerr;stream.on('close',function(code,signal){//在执行shell命令后,将开始上传部署项目的代码放入spinner.start();scpClient.scp('./dist',{host:server.host,port:server.port,username:server.username,password:server.password,path:server.path},function(err){spinner.stop();if(err){console.log(chalk.red('Publishfailed.\n'));throwerr;}else{console.log(chalk.green('成功!成功发布到'+(process.env.NODE_ENV==='prod'?'production':'测试')+'服务器!\n'));}});conn.end();}).on('data',function(data){console.log('STDOUT:'+data);}).stderr.on('data',function(data){console.log('STDERR:'+数据);});});}).connect({host:server.host,port:server.port,username:server.username,password:server.password//privateKey:require('fs').readFileSync('/home/admin/.ssh/id_dsa')});products.js/**读取env环境变量*/constfs=require('fs');constpath=require('path');//env文件决定打包环境并指定对应的serveridconstenvfile=process.env.NODE_ENV==='prod'?'../.env.prod':'../.env.dev';//env环境变量路径constenvPath=path.resolve(__dirname,envfile);//env对象constenvObj=parse(fs.readFileSync(envPath,'utf8'));constSERVER_ID=parseInt(envObj['VUE_APP_SERVER_ID']);functionparse(src){//解析KEY=VAL的文件constres={};src.split('\n').forEach(line=>{//匹配'KEY=VAL'中的"KEY'和'VAL'//eslint-disable-next-lineno-useless-escapeconstkeyValueArr=line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);//匹配?if(keyValueArr!=null){constkey=keyValueArr[1];letvalue=keyValueArr[2]||'';//在引用值中扩展换行符constlen=value?value.length:0;if(len>0&&value.charAt(0)==='"'&&value.charAt(len-1)==='"'){value=value.replace(/\\n/gm,'\n');}//删除任何周围的引号和额外的空格value=value.replace(/(^['"]|['"]$)/g,'').trim();res[键]=值;}});returnres;}/**定义多个服务器账号,根据SERVER_ID导出当前环境服务器账号*/constSERVER_LIST=[{id:0,name:'A-productionenvironment',domain:'www.prod.com',//域名host:'xxx.xxx.xxx.xxx',//ip端口:22,//端口用户名:'root',//登录服务器帐号密码:'root',//登录帐号totheserverpath:'/mdm/nginx/dist'//发布到静态服务器的项目路径},{id:1,name:'B-testenvironment',domain:'test.xxx.com',主机:'xxx.xxx.xxx.xxx',端口:22,用户名:'root',密码:'root',路径:'/home/newResource/dist'}];module.exports=SERVER_LIST[SERVER_ID];创建环境配置文件.env.dev(开发环境)VUE_APP_SERVER_ID=1.env.prod(正式环境)VUE_APP_SERVER_ID=0package.json文件配置启动项"deploy:dev":"npmrunbuild&&cross-envNODE_ENV=devnode./deploy","deploy:prod":"npmrunbuild&&cross-envNODE_ENV=prodnode./deploy"执行命令npmrundeploy:dev打包编译发布到服务器参考:https://www.jianshu.com/p/bfa...
