crootfast
Version:
大前端工程化命令行脚手架
410 lines (373 loc) • 14.6 kB
JavaScript
#!/usr/bin/env node
require('../common/alis');
const { program } = require('commander');
const inquirer = require("inquirer");
const path = require('path');
const { checkNecFile, checkDirExists } = require('../common/utils/checkers');
const { setGlobal, getGlobal, getclipath, getpropath, pathJoin } = require("../common/utils/path");
const { mlog } = require('../common/utils/logWithLineInfo');
const { baseToolSwitchOrInstall, checkDevDependenciesVersionAndInstall } = require('../lib');
const { commandLoggerError, commandLoggerWarning, createSynlinkCommand, commandRunNodeModuleToPro } = require('../lib/cmd');
const { createWebPackProject, installAllEnvironmentPackage, toCommanderLineInterfaceInstallAllPackage, toCommanderLineInterfaceToProjectInstallPackage, toCommanderLineInterfaceDevelop, toCommanderLineInterfaceBuild, toCommanderLineInterfaceAddProject } = require('../lib/create');
const package = require('../package.json');
const { commandCreateMethod } = require('../lib/scripts/commandCallbacks');
// 版本号
program.version(`croot-cli ${package.version}`).usage('<command> [options]');
// 创建一个新的项目
program.command('create [name]').description('使用CLI工具,初始化一个新的前端工程').action(async (name, options) => {
if (!name) {
throw new Error(`必须提供项目名称 [name]`);
// process.exit(1); // 非0的退出码表示出错
}
commandCreateMethod(name, options);
})
// 检查基建依赖层的依赖包版本的情况
program.command('check').description('检查基建依赖层的版本。')
// .option('-b', '--base <environment>', '检查基建依赖层的版本环境,例如:node、npm、pnpm等。')
// .option('-pkg', '--package <package>', '检查基建依赖层的依赖包版本,例如webpack、webpack-dev-server等。')
// .allowUnknownOption()
.action(async (options) => {
// console.log(options);
// await mappingLinkWay();
if (!checkNecFile('.crootrc.js')) {
commandLoggerError('请先进入项目工程目录');
return;
}
console.log(checkNecFile('.crootrc.js'));
// mappingLinkWay();
// console.log(process.cwd(), 'pkg 命令行参数:', options);
});
// // 创建一个新的Command Line Interface Scaffold工程
// program.command('create [name]').description('使用CLI工具,初始化一个新的工程')
// // .option('-y, --yes', '跳过取名')
// .action(async (name, options) => {
// // console.log(process.cwd(), path.join(__dirname, '../'), 'init 命令行参数:', options);
// if (!name) {
// commandLoggerError(`必须提供项目名称 [name]`);
// process.exit(1); // 非0的退出码表示出错
// }
// // 拉取前端monorepo模式的基于webpack的构建的前端工程
// await baseToolSwitchOrInstall(); // 检查基础依赖版本和依赖项
// await createWebPackProject(name); // 根据 name 创建一个前端工程
// // mappingLinkWay();
// // await installAllEnvironmentPackage(name); // 安装环境依赖包
// // checkDevDependenciesVersionAndInstall(); // 检查开发模式中一些重要的依赖包
// // installPackage('pnpm', 'add webpack@5.71.0 -D', 'webpack');
// });
// 安装项目中的依赖
program.command('install [packages...]').description('安装项目中的依赖')
.option('-S, --save', '安装依赖包到 package.dependencies')
.option('-D, --save-dev', '安装依赖包到 package.devDependencies')
.action(async (packages, options) => {
// console.log('Packages: ', packages, options);
// return;
if (!checkNecFile('.crootrc.js')) {
commandLoggerError('请先进入项目工程目录');
return;
}
await baseToolSwitchOrInstall(); // 检查基础依赖版本和依赖项
// await mappingLinkWay(); // 软连接链接项目工程
// pnpm install
if (!packages.length) {
commandLoggerWarning('准备安装整个工程的依赖包');
toCommanderLineInterfaceInstallAllPackage();
}
// 指定依赖包的名称
if (!!packages.length || !!packages.length && (!!options.saveDev || options.save)) {
let { frame, appname } = await installPackCommander();
toCommanderLineInterfaceToProjectInstallPackage(frame, appname, packages.join(" "), options.saveDev);
}
// if (options.save) {
// };
// if (options.saveDev) {
// };
// 此处执行你的逻辑,例如调用npm install命令
// shelljs.exec(`npm install ${options.save ? '-S' : options.saveDev ? '-D' : ''} ${packages.join(' ')}`);
});
program.command('i [packages...]').description('安装项目中的依赖')
.option('-S, --save', '安装依赖包到 package.dependencies')
.option('-D, --save-dev', '安装依赖包到 package.devDependencies')
.action(async (packages, options) => {
if (!checkNecFile('.crootrc.js')) {
commandLoggerError('请先进入项目工程目录');
return;
}
await baseToolSwitchOrInstall(); // 检查基础依赖版本和依赖项
// await mappingLinkWay(); // 软连接链接项目工程
// pnpm install
if (!packages.length) {
commandLoggerWarning('准备安装整个工程的依赖包');
toCommanderLineInterfaceInstallAllPackage();
}
// 指定依赖包的名称
if (!!packages.length || !!packages.length && (!!options.saveDev || options.save)) {
let { frame, appname } = await installPackCommander();
toCommanderLineInterfaceToProjectInstallPackage(frame, appname, packages.join(" "), options.saveDev);
}
});
// program.command('install [package] [...flags]').description('安装项目中的依赖')
// // .option('-a, --all', '安装所有依赖')
// // .option('-app, --appname <appname>', '安装指定项目的依赖')
// .option('-S, --save', '安装依赖包到 package.dependencies')
// .option('-D, --save-dev', '安装依赖包到 package.devDependencies')
// .action(async (package, flags, options) => {
// console.log(package, flags, options);
// return;
// if (!checkNecFile('.crootrc.js')) {
// commandLoggerError('请先进入项目工程目录');
// return;
// }
// await baseToolSwitchOrInstall(); // 检查基础依赖版本和依赖项
// await mappingLinkWay();
// // pnpm install
// if (!package && !flags) {
// commandLoggerWarning('准备安装整个工程的依赖包');
// toCommanderLineInterfaceInstallAllPackage();
// }
// // 指定依赖包的名称
// if (!!package || !!package && (!!options.saveDev || options.save)) {
// let { frame, appname } = await installPackCommander();
// // console.log(frame, appname, package, flags, options.saveDev);
// toCommanderLineInterfaceToProjectInstallPackage(frame, appname, package, options.saveDev);
// }
// // else {
// // // toCommLineInterAddPack();
// // }
// // let { frame, appname } = await installCommander(options);
// // if (frame !== "all") {
// // commandLoggerWarning('准备安装指定项目的依赖包');
// // toCommanderLineInterfaceToProjectInstallPackage(frame, appname);
// // }
// // console.log(package, flags);
// // if (frame === "all") {
// // toCommanderLineInterfaceInstallAllPackage();
// // } else {
// // toCommanderLineInterfaceToProjectInstallPackage(frame, appname);
// // }
// // if (!Object.keys(options).length) {
// // // console.log('install all', getclipath('/webProject'));
// // toCommanderLineInterfaceInstallAllPackage();
// // } else if (options.appname) {
// // } else if (!options.appname) {
// // commandLoggerError('你需要指定一个项目名称,例如:croot install -app demo');
// // process.exit(1); // 非0的退出码表示出错
// // }
// // // if (!options.appname) {
// // // commandLoggerError('你需要指定一个项目名称,例如:croot install -n demo');
// // // process.exit(1); // 非0的退出码表示出错
// // // }
// // console.log(options);
// // console.log(process.cwd(), 'add 命令行参数:', name, options);
// });
// 添加一个项目到工程中
program.command('add [name]').description('使用CLI工具,添加一个新的项目到工程中')
.action(async (name, options) => {
if (!name) {
commandLoggerError('必须提供项目名称');
process.exit(1); // 非0的退出码表示出错
}
let { frame } = await addProjectCommander(options);
toCommanderLineInterfaceAddProject(name, frame);
// console.log(process.cwd(), 'add 命令行参数:', name, options);
});
// 项目启动开发
program.command('start').description('启动一个https协议的项目')
.option('-f, --frame <frame>', '框架 (react、vue) ')
.option('-a, --appname <appname>', '项目名称')
.option('-e, --env <env>', '依赖环境')
.action(async options => {
if (!checkNecFile('.crootrc.js')) {
commandLoggerError('请先进入项目工程目录');
return;
}
// console.log(options, getclipath("."), getpropath("."));
await commandRunNodeModuleToPro();
if (!Object.keys(options).length) { // 开发询问模式(不带任何参数时)
let { frame, appname, env } = await developCommander(options);
toCommanderLineInterfaceDevelop(frame, appname, env);;
return;
}
let { frame, appname, env } = options;
if (frame && appname && env) {
toCommanderLineInterfaceDevelop(frame, appname, env);
} else {
commandLoggerError('需要输入frame、appname、env对应参数和值');
process.exit(1);
}
// console.log(process.cwd(), 'add 命令行参数:', name, options);
});
// 打包构建项目
program.command('build').description('构建项目')
.option('-f, --frame <frame>', '框架 (react、vue) ')
.option('-a, --appname <appname>', '项目名称')
.option('-e, --env <env>', '依赖环境')
.action(async options => {
if (!checkNecFile('.crootrc.js')) {
commandLoggerError('请先进入项目工程目录');
return;
}
await commandRunNodeModuleToPro();
// console.log(options, getclipath("."), getpropath("."));
if (!Object.keys(options).length) { // 打包询问模式(不带任何参数时)
let { frame, appname, env } = await buildCommander(options);
toCommanderLineInterfaceBuild(frame, appname, env);
return;
}
let { frame, appname, env } = options;
if (frame && appname && env) {
toCommanderLineInterfaceBuild(frame, appname, env);
} else {
commandLoggerError('需要输入frame、appname、env对应参数和值');
process.exit(1);
}
// console.log(process.cwd(), 'add 命令行参数:', name, options);
});
// program.command('npm [packages...]').description('执行npm的方法')
// .action(async (packages, options) => {
// });
// 性能监控
program.command('performance').description('性能检查');
// 解析命令行参数,作语法分析
program.parse(process.argv);
// 校验映射符号文件夹,软链接的方式。
async function mappingLinkWay() {
let source = `${getGlobal('prodir')}`;
let linkTarget = pathJoin('webProject/client', `${getGlobal('crootdir')}`);
return createSynlinkCommand(source, linkTarget);
// if (!checkDirExists(linkTarget)) {
// // return await createSymlink(source, linkTarget);
// return createSynlinkCommand(source, linkTarget);
// }
};
async function addProjectCommander() {
let oInquirer = await inquirer.prompt([
{
type: "list",
message: "请选择他的框架",
name: "frame",
default: "react",
choices: [
"react",
"vue3"
]
}
]);
return oInquirer;
};
async function installPackCommander(options) {
let oInquirer = await inquirer.prompt([
{
type: "list",
message: "请选择要安装到的目录",
name: "frame",
default: "react",
choices: [
"react",
"vue3"
]
}, {
type: "input",
message: "请输入项目的名称,例如:demo;",
name: "appname",
default: "demo"
}
]);
return oInquirer;
};
async function addPackCommander() {
let oInquirer = await inquirer.prompt([
{
type: "input",
message: "请输入你想下载的依赖的名称",
name: "packname",
default: "react react-loader || react@latest -S || react -S"
}, {
type: "list",
message: "你想安装在哪里",
name: "frame",
default: "react",
choices: [
"root",
"react",
"vue3"
]
}
]);
return oInquirer;
}
async function developCommander(options) {
let oInquirer = await inquirer.prompt([
{
type: "list",
message: "请选择你使用的框架",
name: "frame",
default: "react",
choices: [
"react",
"vue3"
]
},
{
type: "input",
message: "请输入项目名称,例如:demo;",
name: "appname",
default: "demo"
},
{
type: "list",
message: "请选择依赖的服务器环境",
name: "env",
default: "test",
choices: [
"dev",
"test",
"stating"
// "prod"
]
}
]);
return oInquirer;
};
async function buildCommander(options) {
let oInquirer = await inquirer.prompt([
{
type: "list",
message: "请选择你使用的框架",
name: "frame",
default: "react",
choices: [
"react",
"vue3"
]
},
{
type: "input",
message: "请输入项目名称,例如:demo;",
name: "appname",
default: "demo"
},
{
type: "list",
message: "请选择依赖的服务器环境",
name: "env",
default: "stating",
choices: [
// "dev",
"test",
"stating",
"prod"
]
}
]);
return oInquirer;
}
// // 检查基建依赖层版本环境 - node、npm、pnpm
// program.command('check').description('检查基建依赖层的版本环境,例如:node、npm、pnpm等。')
// // .option('-p, --plugin <plugin>', '插件名')
// // .allowUnknownOption()
// .action((options) => {
// // console.log(process.cwd(), 'checkbase 命令行参数:', options.plugin);
// baseToolSwitchOrInstall().then(resp => {
// console.log('检查基建依赖层版本环境', resp);
// });
// });