easy-cli2
Version:
一个简易的脚手架,提供eslint格式化检查,创建项目模板,自动部署功能,xlsx与json互转,压缩图片等功能
370 lines (369 loc) • 17.1 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deployCommand = void 0;
var fs_extra_1 = __importDefault(require("fs-extra"));
var inquirer_1 = __importDefault(require("inquirer"));
var path_1 = __importDefault(require("path"));
var ora_1 = __importDefault(require("ora"));
var jsonfile_1 = __importDefault(require("jsonfile"));
var shelljs_1 = __importDefault(require("shelljs"));
var node_ssh_1 = require("node-ssh");
var archiver_1 = __importDefault(require("archiver"));
var util_1 = require("../../util");
var projectDir = process.cwd();
var ssh = new node_ssh_1.NodeSSH();
var deploy = function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, projectName, config, error_1;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 7, , 8]);
return [4 /*yield*/, getConfig()];
case 1:
_a = _b.sent(), projectName = _a.projectName, config = _a.config;
execBuild(config.script);
return [4 /*yield*/, startZip(config.distPath)];
case 2:
_b.sent();
return [4 /*yield*/, connectSSH(config)];
case 3:
_b.sent();
return [4 /*yield*/, uploadFile(config.webDir)];
case 4:
_b.sent();
return [4 /*yield*/, unzipFile(config.webDir)];
case 5:
_b.sent();
return [4 /*yield*/, deleteLocalZip()];
case 6:
_b.sent();
(0, util_1.loggerSuccess)("".concat((0, util_1.loggerUnderline)(projectName), "\u9879\u76EE\u90E8\u7F72\u6210\u529F^_^\n"));
shelljs_1.default.exit(0);
return [3 /*break*/, 8];
case 7:
error_1 = _b.sent();
(0, util_1.loggerError)('部署失败');
(0, util_1.loggerError)(error_1);
shelljs_1.default.exit(1);
return [3 /*break*/, 8];
case 8: return [2 /*return*/];
}
});
}); };
function getConfig() {
return __awaiter(this, void 0, void 0, function () {
var configFileName, configFilePath, configExist, _a, projectName, envName_1, host, port, username, password, distPath, webDir, script, config, file, allEnv, envName, envConfig;
var _b;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
configFileName = 'deploy_config.json';
configFilePath = path_1.default.resolve(projectDir, configFileName);
return [4 /*yield*/, fs_extra_1.default.pathExists(configFilePath)];
case 1:
configExist = _c.sent();
if (!!configExist) return [3 /*break*/, 5];
(0, util_1.loggerInfo)('检测到配置文件不存在,下面请配置发布的环境');
return [4 /*yield*/, inquirer_1.default.prompt([
{
name: 'projectName',
type: 'input',
message: '请输入项目名称:',
},
{
name: 'envName',
type: 'input',
message: '请输入环境名称:',
},
{
name: 'host',
type: 'input',
message: '请输入服务器地址:',
},
{
name: 'port',
type: 'input',
message: '请输入服务器端口:',
},
{
name: 'username',
type: 'input',
message: '请输入登录服务器用户名:',
},
{
name: 'password',
type: 'input',
message: '请输入登录服务器密码:',
},
{
name: 'distPath',
type: 'input',
message: '请输入本地打包dist目录:',
},
{
name: 'webDir',
type: 'input',
message: '请输入服务器项目地址:',
},
{
name: 'script',
type: 'input',
message: '请输入打包命令:',
},
])];
case 2:
_a = _c.sent(), projectName = _a.projectName, envName_1 = _a.envName, host = _a.host, port = _a.port, username = _a.username, password = _a.password, distPath = _a.distPath, webDir = _a.webDir, script = _a.script;
config = {
projectName: projectName,
env: (_b = {},
_b[envName_1] = {
host: host,
port: port,
username: username,
password: password,
distPath: distPath,
webDir: webDir,
script: script,
},
_b),
};
return [4 /*yield*/, fs_extra_1.default.createFile(configFileName)];
case 3:
_c.sent();
return [4 /*yield*/, jsonfile_1.default.writeFile(configFilePath, config, { spaces: 2 })];
case 4:
_c.sent();
(0, util_1.loggerInfo)('配置文件已生成,下面开始打包');
_c.label = 5;
case 5: return [4 /*yield*/, jsonfile_1.default.readFile(configFilePath)];
case 6:
file = _c.sent();
allEnv = Object.keys(file.env);
return [4 /*yield*/, inquirer_1.default.prompt([
{
name: 'envName',
type: 'list',
message: '请选择要发布的环境:',
choices: allEnv.map(function (env) { return ({
name: env,
value: env,
}); }),
},
])];
case 7:
envName = (_c.sent()).envName;
envConfig = file.env[envName];
return [2 /*return*/, {
projectName: file.projectName,
config: envConfig,
}];
}
});
});
}
// 第一步,执行打包脚本
function execBuild(script) {
try {
(0, util_1.loggerInfo)("\uFF081\uFF09".concat(script));
var spinner = (0, ora_1.default)('正在打包中...');
spinner.start();
var res = shelljs_1.default.exec(script, { silent: true });
if (res.code === 0) {
(0, util_1.loggerSuccess)('打包成功!');
}
else {
(0, util_1.loggerError)("run ".concat(script, " failed"));
shelljs_1.default.exit(1);
}
spinner.stop();
}
catch (err) {
(0, util_1.loggerError)(err);
shelljs_1.default.exit(1);
}
}
// 第二部,打包zip
function startZip(distPath) {
return new Promise(function (resolve, reject) {
distPath = path_1.default.resolve(projectDir, distPath);
(0, util_1.loggerInfo)('(2)正在打包成zip');
var archive = (0, archiver_1.default)('zip', {
zlib: { level: 9 },
}).on('error', function (err) {
throw err;
});
var output = fs_extra_1.default.createWriteStream("".concat(projectDir, "/dist.zip"));
output.on('close', function (err) {
if (err) {
(0, util_1.loggerError)("\u5173\u95EDarchiver\u5F02\u5E38 ".concat(err));
reject(err);
process.exit(1);
}
(0, util_1.loggerSuccess)('zip打包成功!');
resolve(true);
});
archive.pipe(output);
archive.directory(distPath, '/');
archive.finalize();
});
}
// 第三步,连接SSH
function connectSSH(config) {
return __awaiter(this, void 0, void 0, function () {
var host, port, username, password, sshConfig, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
host = config.host, port = config.port, username = config.username, password = config.password;
sshConfig = {
host: host,
port: port,
username: username,
password: password,
};
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
(0, util_1.loggerInfo)("\uFF083\uFF09\u6B63\u5728\u8FDE\u63A5\u670D\u52A1\u5668".concat((0, util_1.loggerUnderline)(host + ':' + port)));
return [4 /*yield*/, ssh.connect(sshConfig)];
case 2:
_a.sent();
(0, util_1.loggerSuccess)('SSH连接成功');
return [3 /*break*/, 4];
case 3:
err_1 = _a.sent();
(0, util_1.loggerError)("\u8FDE\u63A5\u5931\u8D25 ".concat(err_1));
process.exit(1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
}
// 第四部,上传zip包
function uploadFile(webDir) {
return __awaiter(this, void 0, void 0, function () {
var err_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
(0, util_1.loggerInfo)("\uFF084\uFF09\u6B63\u5728\u4E0A\u4F20zip\u81F3\u76EE\u5F55".concat((0, util_1.loggerUnderline)(webDir)));
return [4 /*yield*/, ssh.putFile("".concat(projectDir, "/dist.zip"), "".concat(webDir, "/dist.zip"))];
case 1:
_a.sent();
(0, util_1.loggerSuccess)(' zip包上传成功');
return [3 /*break*/, 3];
case 2:
err_2 = _a.sent();
(0, util_1.loggerError)(" zip\u5305\u4E0A\u4F20\u5931\u8D25 ".concat(err_2));
process.exit(1);
return [3 /*break*/, 3];
case 3: return [2 /*return*/];
}
});
});
}
// 运行命令
function runCommand(command, webDir) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, ssh.execCommand(command, { cwd: webDir })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
// 第五步,解压zip包
function unzipFile(webDir) {
return __awaiter(this, void 0, void 0, function () {
var err_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 3, , 4]);
(0, util_1.loggerInfo)('(5)开始解压zip包');
return [4 /*yield*/, runCommand("cd ".concat(webDir), webDir)];
case 1:
_a.sent();
return [4 /*yield*/, runCommand('unzip -o dist.zip && rm -f dist.zip', webDir)];
case 2:
_a.sent();
(0, util_1.loggerSuccess)('zip包解压成功');
return [3 /*break*/, 4];
case 3:
err_3 = _a.sent();
(0, util_1.loggerError)("zip\u5305\u89E3\u538B\u5931\u8D25 ".concat(err_3));
process.exit(1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
}
// 第六步,删除本地dist.zip包
function deleteLocalZip() {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
(0, util_1.loggerInfo)('(6)开始删除本地zip包');
fs_extra_1.default.unlink("".concat(projectDir, "/dist.zip"), function (err) {
if (err) {
(0, util_1.loggerError)("\u672C\u5730zip\u5305\u5220\u9664\u5931\u8D25 ".concat(err));
reject(err);
process.exit(1);
}
(0, util_1.loggerSuccess)(' 本地zip包删除成功\n');
resolve(true);
});
})];
});
});
}
exports.deployCommand = {
description: 'deploy project',
command: 'deploy',
action: deploy,
};