UNPKG

crootfast

Version:

大前端工程化命令行脚手架

410 lines (373 loc) 14.6 kB
#!/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); // }); // });