itoolbox-cli
Version:
iToolBox CLI 工具,用于创建扩展,打包扩展.
110 lines (99 loc) • 4.29 kB
JavaScript
const path = require('path');
// fs 扩展库
const fs = require('fs-extra');
// 命令行库
const shell = require('shelljs');
// 交互式命令界面
const inquirer = require('inquirer');
// 命令行loading工具
const ora = require('ora');
// git库下载工具
const download = require('download-git-repo');
// node 原生文件操作方法
const exists = require('fs').existsSync;
const terminalLink = require('terminal-link');
const logger = require('./logger');
const { findNpm, getLocalTip } = require('../common/utils');
const cwd = process.cwd();
const ENMU = require('../constants/emnu');
const { REPO_ORIGIN } = require('../constants/base');
const { NEW_QUESTION } = require('../constants/question');
const TIP_INFO = getLocalTip().new;
module.exports = function (args) {
logger.infoTip(TIP_INFO.info);
const autoInstall = !(args[3] === '--no-auto-install');
inquirer.prompt(NEW_QUESTION).then(function (answers) {
// 接收输入的项目名称
const projectName = `${answers.name}`;
// 重新定义项目的地址
const targetPath = path.join(cwd, `${answers.path}` || './');
// 检测路径是否存在
if (exists(path.join(targetPath, projectName))) {
// 存在,直接输入错误信息,并返回
logger.errorTip(TIP_INFO.createFolderFail[0], TIP_INFO.createFolderFail[1]);
return;
}
// 定义加载中的提示信息
const spinner = ora(TIP_INFO.downloadTip);
// 开始执行loading
spinner.start();
const { branch, homepage, desc, name, short } = ENMU[answers.template];
// 下载项目
download(`${REPO_ORIGIN}${branch}`, path.join(targetPath, projectName), {
clone: false
}, function (err) {
// 关闭loading
spinner.stop();
if (err) {
// 出现错误
logger.errorTip(TIP_INFO.downloadFail);
} else {
// 下载成功
logger.successTip(TIP_INFO.downloadSuccess);
// 修改package内容为当前项目设置内容
changePkgValue(path.join(targetPath, projectName), answers, function() {});
// 不自动安装依赖,直接返回
if (!autoInstall) {
return;
}
const npm = findNpm();
logger.info('获取到本地的模块管理工具', npm);
// 定义自动安装依赖时的提示信息
const spinnerInstall = ora(TIP_INFO.autoInstallTip);
spinnerInstall.start();
// 通过 shell 进入项目目录进行安装依赖
npm && shell.exec(`cd ${path.join(targetPath, projectName)} && ${npm} install`, function () {
spinnerInstall.stop();
logger.info(TIP_INFO.autoInstallSuccess);
logger.info(`${TIP_INFO.linkTip[0]} ${terminalLink(`https://github.com/${REPO_ORIGIN}${branch}`, `https://github.com/${REPO_ORIGIN}${branch}`)} ${TIP_INFO.linkTip[1]}`);
homepage && logger.info(`${TIP_INFO.homepageTip[0]} ${terminalLink(homepage, homepage)} ${TIP_INFO.homepageTip[1]}`);
logger.successTip(TIP_INFO.success);
});
}
})
});
};
function changePkgValue (filePath, answers, callback) {
fs.readFile(`${filePath}/package.json`, 'utf8', function (err, data) {
const val = JSON.parse(data);
val.name = answers.name;
val.description = answers.desc;
val.author = answers.author;
val.license = answers.license || 'MIT';
val.homepage = answers.gitsrc || '';
val.extInfo = {
description: answers.desc || '',
name: answers.name,
version: '1.0.0',
author: answers.author,
rarName: answers.rarName,
index: 'index.html',
logo: "./src/assets/logo.png",
width: 700,
height: 700
};
fs.writeFile(`${filePath}/package.json`, JSON.stringify(val, null, '\t'), 'utf8', function (err) {
callback && callback();
});
});
};