const fsExtra = require('fs-extra') const path = require('path') const chalk = require('chalk') const fs = require('fs') const {exec} = require("child_process"); /** * 将函数封装成promise */ const promisify = fn => { return function () { let args = arguments; return new Promise(function (resolve, reject) { [].push.call(args, function (err, result) { if (err) { console.log(err) reject(err); } else { resolve(result); } }); fn.apply(null, args); }); } } const readdir = promisify(fs.readdir) const stat = promisify(fs.stat) /** * 封装打印工具 */ const {log} = console const chalkTag = { info: msg => log([chalk.bgBlue.black(' INFO '), msg].join(' ')), done: msg => log([chalk.bgGreen.black(' DONE '), msg].join(' ')), warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')), error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')), } /** * 遍历应用的方法 */ const findApp = (dir, cb) => { fsExtra.ensureDirSync(dir) return readdir(dir).then(apps => { return Promise.all(apps.map(e => { let cPath = path.join(dir, e) return stat(cPath).then(state => { if (state.isDirectory()) { return findApp(cPath, cb) } else if (state.isFile()) { cb && cb(dir) } }) }) || []) }) } /** * 迁移apps文件 */ const copyFiles = (dir, source = 'src/mods') => { chalkTag.info(`开始扫描${source}...`) return new Promise(resolve => { fsExtra.emptyDir(dir, err => { if (!err) { fsExtra.copy(source, dir).then(() => { chalkTag.done(source + ' 扫描完毕') resolve() }) } }) }) } /** * 初始化打包配置文件 */ const init = () => { chalkTag.info('开始运行项目打包工具...') return new Promise(resolve => fs.readdir('./project', (err, files) => { resolve(files.filter(e => e.indexOf('.') < 0)) })) } /** * 拷贝对应文件 */ const generateMain = project => { const getApps = new Promise(resolve => { const appLib = path.join(__dirname, project.toString(), 'apps.import.json') fsExtra.readJson(appLib, (err, data) => { chalkTag.info(project + '加载业务应用配置...') let apps = [] if (data) { fsExtra.emptyDirSync(`project/${project}/apps`) findApp('src/mods', file => { apps.push(file) }).then(() => { Promise.all(Object.keys(data).map(e => { let app = [...new Set(apps)].find(s => s.indexOf(e) > -1) if (app) { return copyFiles(`project/${project}/apps/${e}`, app) } })).then(() => { chalkTag.done(project + '业务应用加载完成') resolve() }) }) } else { chalkTag.done(project + '业务应用无打包') resolve() } }) }) return Promise.all([getApps]) } const start = () => { //询问打包哪个项目 init().then(choices => { return Promise.all(choices.map(prj => generateMain(prj))).then(() => { chalkTag.info('开始发布...') }) }) } start();