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 相关文章推荐
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
面向对象的Javascript之二(接口实现介绍)
Jan 27 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 Javascript
D3.js实现折线图的方法详解
Sep 21 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
Nov 29 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
Node.js实现一个HTTP服务器的方法示例
May 13 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
discuz安全提问算法
2007/06/06 PHP
用mysql内存表来代替php session的类
2009/02/01 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
微信小程序之前台循环数据绑定
2017/08/18 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
用python写的一个wordpress的采集程序
2016/02/27 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Linux下python3.7.0安装教程
2018/07/30 Python
python实现推箱子游戏
2020/03/25 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
领导干部培训感言
2014/01/23 职场文书
食品采购员岗位职责
2014/04/14 职场文书
学生会部长竞选稿
2015/11/19 职场文书