const chalk = require("chalk"); const inquirer = require("inquirer"); const fs = require("fs-extra"); const os = require("os"); const shell = require("shelljs"); const PRO_PATH = process.env.INIT_CWD || process.env.npm_rootpath || process.cwd(); const CUR_PATH = `${__dirname}/..`; class Factory { constructor(type) { this.type = type; this.CUR_POJ_PATH = `${CUR_PATH}/template/${type}/`; this.SYS_TYPE = os.type(); } static log(msg, type = "cyan") { process.stdout.write(chalk[type](msg)); } copyFile() { Factory.log("开始拷贝文件 \n"); switch (this.type) { case "web": break; case "pro": break; default: Factory.log("未知类型", "red"); } fs.copySync(this.CUR_POJ_PATH, `${PRO_PATH}/`, { filter: src => { return ( !(src.indexOf("package.json") >= 0) && !(src.indexOf("package-lock.json") >= 0) && !(src.indexOf("eslintrc") >= 0) && !(src.indexOf("README.md") >= 0) && !(src.indexOf("gitignore") >= 0) ); } }); fs.copySync(`${this.CUR_POJ_PATH}.eslintrc.js`, `${PRO_PATH}/.eslintrc.js`); fs.copySync( `${this.CUR_POJ_PATH}.gitignore.template`, `${PRO_PATH}/.gitignore` ); fs.copySync(`${this.CUR_POJ_PATH}README.md`, `${PRO_PATH}/README.md`); } // 处理依赖 trimPackage() { Factory.log("开始处理依赖 \n"); let temPackage; switch (this.type) { case "web": temPackage = fs.readJSONSync(`${this.CUR_POJ_PATH}package.json`); break; case "pro": temPackage = fs.readJSONSync(`${this.CUR_POJ_PATH}/package.json`); break; default: Factory.log("未知类型", "red"); return; } const curPackage = fs.readJsonSync(`${PRO_PATH}/package.json`); if (!curPackage.devDependencies) { curPackage.devDependencies = {}; } if (!curPackage.dependencies) { curPackage.dependencies = {}; } // devDependencies Object.keys(temPackage.devDependencies).forEach(item => { const libLocalVersion = curPackage.devDependencies[item] || (curPackage.dependencies && curPackage.dependencies[item]); const libTemVersion = temPackage.devDependencies[item]; if (libLocalVersion) { if (libLocalVersion !== libTemVersion) { Factory.log( `${item}: location => ${libLocalVersion} || tem => ${libTemVersion}`, "yellow" ); } } else { curPackage.devDependencies[item] = temPackage.devDependencies[item]; } }); // dependencies Object.keys(temPackage.dependencies).forEach(item => { const libLocalVersion = curPackage.dependencies[item] || (curPackage.dependencies && curPackage.dependencies[item]); const libTemVersion = temPackage.dependencies[item]; if (libLocalVersion) { if (libLocalVersion !== libTemVersion) { Factory.log( `${item}: location => ${libLocalVersion} || tem => ${libTemVersion}`, "yellow" ); } } else { curPackage.dependencies[item] = temPackage.dependencies[item]; } }); // scripts // 暂时不考虑覆盖问题 curPackage.scripts = temPackage.scripts; curPackage.prettier = temPackage.prettier; curPackage["lint-staged"] = temPackage["lint-staged"]; // pre commit curPackage["pre-commit"] = temPackage["pre-commit"]; Factory.log("============================ \n", "yellow"); Factory.log(JSON.stringify(curPackage.dependencies), "yellow"); Factory.log("============================ \n", "yellow"); if (curPackage.dependencies && curPackage.dependencies["nemean-cli"]) { Factory.log("删除nemean-cli包"); delete curPackage.dependencies["nemean-cli"]; } fs.writeJSONSync(`${PRO_PATH}/package.json`, curPackage, { spaces: 2 }); } // 后续工作 callBack() { Factory.log("开始卸载nemean-cli依赖 \n"); shell.exec("npm uninstall nemean-cli --save"); } start() { try { this.copyFile(); // copy核心文件 this.trimPackage(); // 处理依赖 this.callBack(); // 执行后续 } catch (e) { Factory.log("构建失败" + e, "red"); } } } module.exports = function begin() { Factory.log("开始构建项目 \n"); const prompts = [ { type: "list", name: "type", message: "请选择项目类型:", pageSize: 2, choices: [ { name: "app", value: "web" }, { name: "Ant design pro", value: "pro" } ] } ]; inquirer.prompt(prompts).then(answers => { // if (answers.type !== "mobile") { // Factory.log("功能开发中...", "gray"); // return; // } const factory = new Factory(answers.type); factory.start(); Factory.log("构建项目完毕 :p \n"); }); // process.stdout.write(chalk.cyan("始构建项目完毕 :p \n")); };