既然是了解vue
项目的自动化部署,首先须要本地搭建一个vue
的项目(经过脚手架3.x和4.x版本均可以)而后使用npm
下载本文的主角scp2
插件,环境搭建以及插件下载不作赘述;
-
提到vue
分环境,你们确定都知道,须要在项目根目录下新建.env.xxx
格式的文件,假设咱们须要部署一个stage
环境,咱们能够在项目根目录新建一个.env.stage
文件,内容以下:
NODE_ENV = 'production'
VUE_APP_BASE_URL = ''
VUE_APP_TITLE = ''
VUE_APP_SERVER_HOST = ""
VUE_APP_SERVER_PORT = ""
VUE_APP_SERVER_USER = ""
VUE_APP_SERVER_PWD = ""
VUE_APP_SERVER_PATH = ""
VUE_APP_DIST = "dist-stage"复制代码
其中 VUE_APP_DIST = "dist-stage"
用来自定义打包文件夹名称,方便部署的时候区分不一样环境包,能够在vue.config.js
配置环境变量 outputDir: process.env.VUE_APP_DIST || "dist"
-
在项目根目录下建立deploy
文件夹,在deploy
文件夹下新建build.js
文件,用于写入咱们的部署脚本;
在package.json
的scripts
加入咱们须要执行的命令
"deploy:stage": "node deploy/build.js stage" 复制代码
其中stage
就是咱们须要携带的环境参数(也能够经过NODE_ENV=XXX
来指定,这样就能够直接获取环境变量)执行node
命令携带的附加参数能够经过process.argv
来获取,从而咱们就能够区分当前须要打包的环境
const args = process.argv.splice(2);
const env = args[0];
const fs = require("fs");
const path = require("path");
const envfile = `../.env.${env}`;
const envPath = path.resolve(__dirname, envfile);复制代码
咱们已经获取当前部署环境,以及对应环境配置文件所在的具体位置,接下来须要读取对应配置文件信息,读取文件此处经过一个parse
方法,进行分行读取内容并解析成key
与value
的键值对存入一个对象供使用;
const parse = src => {
const res = {};
src.split("\n").forEach(line => {
const keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);
if (keyValueArr != null) { const key = keyValueArr[1];
let value = keyValueArr[2] || "";
const len = 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[key] = value;
}
});
return res;
};复制代码
至此咱们已经能够区分环境并获得不一样环境的服务器参数,执行scp2
部署命令便可,完整内容以下:
const client = require("scp2");
const args = process.argv.splice(2);
const env = args[0];const fs = require("fs");
const path = require("path");
const envfile = `../.env.${env}`;
const envPath = path.resolve(__dirname, envfile);
envObj = parse(fs.readFileSync(envPath, "utf8"));
const SERVER = {
host: envObj["VUE_APP_SERVER_HOST"],
username: envObj["VUE_APP_SERVER_USER"],
password: envObj["VUE_APP_SERVER_PWD"],
port: envObj["VUE_APP_SERVER_PORT"],
path: envObj["VUE_APP_SERVER_PATH"]
};
const dist = envObj["VUE_APP_DIST"];
console.log(envObj);
client.scp(`./${dist}/`, SERVER, function(err) {
if (!err) {
console.log(`已上传至${env}环境,scp2工具上传完毕`);
} else {
console.log("err", err);
}
});
const parse = src => {
const res = {};
src.split("\n").forEach(line => {
const keyValueArr = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);
if (keyValueArr != null) {
const key = keyValueArr[1];
let value = keyValueArr[2] || "";
const len = 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[key] = value;
}
});
return res;
};复制代码