Vue自动构建发布脚本的方法示例


Posted in Javascript onJuly 24, 2020

简介

使用cross-env, scp2两个插件完成

cross-env

cross-env这是一款运行跨平台设置和使用环境变量的脚本。

为什么需要cross-env?

NODE_ENV=production 像这样设置环境变量时,大多数Windows命令提示符都会阻塞 。(Windows上的Bash是例外,它使用本机Bash。)同样,Windows和POSIX命令使用环境变量的方式也有所不同。对于POSIX,您可以使用: $ENV_VAR 和在Windows上可以使用 %ENV_VAR% 。
cross-env这样,您就可以使用单个命令,而不必担心为平台正确设置或使用环境变量。就像在POSIX系统上运行时一样,只需对其进行设置即可,并且cross-env会妥善设置。

scp2

scp2是一个基于ssh2的纯JavaScript安全复制程序。ssh2很大程度上由ssh2驱动,scp以某种sftp方式实现。
它是用纯JavaScript编写的,并且可以在每个OS上运行,甚至Windows也可以。必须使用Nodejs(v0.8.7或更高版本)才能使其正常工作。

安装

在项目根目录下一键安装

cnpm install scp2 --save-dev
cnpm install cross-env --save-dev

根目录下创建deploy文件夹, 在deploy目录下创建index.js(代码入口文件), products.js(配置文件和核心代码). 代码如下

index.js

// deploy/index.js里面
const scpClient = require('scp2');
const ora = require('ora');
const chalk = require('chalk');
const server = require('./products');
const spinner = ora(
  '正在发布到' +
  (process.env.NODE_ENV === 'prod' ? '生产' : '测试') +
  '服务器...'
);

var Client = require('ssh2').Client;

var conn = new Client();
conn
  .on('ready', function() {
    // rm 删除dist文件,\n 是换行 换行执行 重启nginx命令 我这里是用docker重启nginx
    // rm -rf /mdm/nginx/dist\ndocker restart nginx
    conn.exec( `cp -r /home/newResource/dist/. /home/newResource/dist${new Date().toLocaleDateString().replace(/\//g,'-')} \nrm -rf /home/newResource/dist` , function(
      err,
      stream
    ) {
      if (err) throw err;
      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('发布失败.\n'));
                throw err;
              } else {
                console.log(
                  chalk.green(
                    'Success! 成功发布到' +
                    (process.env.NODE_ENV === 'prod' ?
                      '生产' :
                      '测试') +
                    '服务器! \n'
                  )
                );
              }
            }
          );

          conn.end();
        })
        .on('data', function(data) {
          console.log('STDOUT: ' + data);
        })
        .stderr.on('data', function(data) {
          console.log('STDERR: ' + data);
        });
    });
  })
  .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环境变量
 */
const fs = require('fs');
const path = require('path');
// env 文件 判断打包环境指定对应的服务器id
const envfile = process.env.NODE_ENV === 'prod' ? '../.env.prod' : '../.env.dev';
// env环境变量的路径
const envPath = path.resolve(__dirname, envfile);
// env对象
const envObj = parse(fs.readFileSync(envPath, 'utf8'));
const SERVER_ID = parseInt(envObj['VUE_APP_SERVER_ID']);

function parse(src) {
  // 解析KEY=VAL的文件
  const res = {};
  src.split('\n').forEach(line => {
    // matching "KEY' and 'VAL' in 'KEY=VAL'
    // eslint-disable-next-line no-useless-escape
    const keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);
    // matched?
    if (keyValueArr != null) {
      const key = keyValueArr[1];
      let value = keyValueArr[2] || '';

      // expand newlines in quoted values
      const len = value ? value.length : 0;
      if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
        value = value.replace(/\\n/gm, '\n');
      }

      // remove any surrounding quotes and extra spaces
      value = value.replace(/(^['"]|['"]$)/g, '').trim();

      res[key] = value;
    }
  });
  return res;
}

/*
 *定义多个服务器账号 及 根据 SERVER_ID 导出当前环境服务器账号
 */
const SERVER_LIST = [{
    id: 0,
    name: 'A-生产环境',
    domain: 'www.prod.com', // 域名
    host: 'xxx.xxx.xxx.xxx', // ip
    port: 22, // 端口
    username: 'root', // 登录服务器的账号
    password: 'root', // 登录服务器的账号
    path: '/mdm/nginx/dist' // 发布至静态服务器的项目路径
  },
  {
    id: 1,
    name: 'B-测试环境',
    domain: 'test.xxx.com',
    host: 'xxx.xxx.xxx.xxx',
    port: 22,
    username: 'root',
    password: 'root',
    path: '/home/newResource/dist'
  }
];

module.exports = SERVER_LIST[SERVER_ID];

创建环境配置文件

.env.dev (开发环境)

VUE_APP_SERVER_ID=1

.env.prod (正式环境)

VUE_APP_SERVER_ID=0

package.json文件配置启动项

"deploy:dev": "npm run build && cross-env NODE_ENV=dev node ./deploy",
"deploy:prod": "npm run build && cross-env NODE_ENV=prod node ./deploy"

执行命令

npm run deploy:dev

就可以直接打包编译发布到服务器

参考:https://3water.com/article/191671.htm

到此这篇关于Vue自动构建发布脚本的方法示例的文章就介绍到这了,更多相关Vue自动构建发布脚本内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
img标签中onerror用法
Aug 13 Javascript
得到form下的所有的input的js代码
Nov 07 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
Mar 04 Javascript
jquery模拟实现鼠标指针停止运动事件
Jan 12 Javascript
解析JavaScript中的字符串类型与字符编码支持
Jun 24 Javascript
js动态添加的DIV中的onclick事件简单实例
Jul 25 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
Aug 05 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
详解webpack+express多页站点开发
Dec 22 Javascript
基于VSCode调试网页JavaScript代码过程详解
Jul 20 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 #Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 #Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 #Javascript
vue+axios全局添加请求头和参数操作
Jul 24 #Javascript
vue在响应头response中获取自定义headers操作
Jul 24 #Javascript
vuex存取值和映射函数使用说明
Jul 24 #Javascript
js实现金山打字通小游戏
Jul 24 #Javascript
You might like
如何将数据从文本导入到mysql
2006/10/09 PHP
php创建sprite
2014/02/11 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python计算回文数的方法
2015/03/11 Python
Django CBV类的用法详解
2019/07/26 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
Weblogic的布署方式
2013/08/23 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
电大本科自我鉴定
2014/02/05 职场文书
活动策划邀请函
2014/02/06 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
大学副班长竞选稿
2015/11/21 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript