diff --git a/package.json b/package.json index 54e5ca14..f9f463a3 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,12 @@ "lib": "vue-cli-service build --no-clean --target lib --dest lib packages/index.js&&npm unpublish --force&&npm publish", "lib:core": "vue-cli-service build --target lib --dest core/dist core/index.js --name vc-app-core&&npm unpublish --force&&npm publish", "lib:project": "node project/build.js", - "lib:sass": "node project/sass.js", + "lib:all": "node project/allProject.js&&npm unpublish --workspaces --force&&npm publish --workspaces", "ui": "npm i dvcp-ui@latest dvcp-dv-ui@latest" }, + "workspaces": [ + "project/*" + ], "dependencies": { "@amap/amap-jsapi-loader": "^1.0.1", "@jiaminghi/data-view": "^2.10.0", @@ -88,4 +91,4 @@ "last 2 versions", "not ie <= 8" ] -} \ No newline at end of file +} diff --git a/project/sass.js b/project/allProject.js similarity index 53% rename from project/sass.js rename to project/allProject.js index 50d91ae9..a782120b 100644 --- a/project/sass.js +++ b/project/allProject.js @@ -1,6 +1,5 @@ const fsExtra = require('fs-extra') const path = require('path') -const {exec} = require('child_process') const chalk = require('chalk') const fs = require('fs') /** @@ -22,8 +21,10 @@ const promisify = fn => { }); } } + const readdir = promisify(fs.readdir) const stat = promisify(fs.stat) + /** * 封装打印工具 */ @@ -34,6 +35,7 @@ const chalkTag = { warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')), error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')), } + /** * 遍历应用的方法 */ @@ -51,53 +53,73 @@ const findApp = (dir, cb) => { }) || []) }) } -const start = () => { - chalkTag.info("开始运行sass应用打包工具") - let cores, apps, PROJECT = "sass" - new Promise(resolve => { - let install = path.join(__dirname, PROJECT, 'index.js') +/** + * 初始化打包配置文件 + */ +const init = () => { + chalkTag.info('开始运行项目打包工具...') + return new Promise(resolve => fs.readdir('./project', (err, files) => { + resolve(files.filter(e => e.indexOf('.') < 0)) + })) +} +/** + * 生成对应的main入口js文件 + */ +const generateMain = project => { + let cores, apps + const getCores = new Promise(resolve => { + let install = path.join(__dirname, project, 'index.js') fsExtra.ensureFile(install) - const coreLib = path.join(__dirname, PROJECT, 'core.import.json') - + const coreLib = path.join(__dirname, project, 'core.import.json') fsExtra.readJson(coreLib, (err, data) => { - chalkTag.info("加载核心库配置..") + chalkTag.info(project + "加载核心库配置..") cores = [] if (data) { findApp('core/apps', file => { - let fileName = file.replace(/.*(App\w+)\.vue/g, '$1') + let fileName = file.replace(/.*\\(.+)\.vue/g, '$1') if (Object.keys(data).includes(fileName)) { cores.push({name: fileName, component: file.replace(/\\/g, "/")}) - log(">>>正在打包核心库...%s", fileName) } }).then(() => { - chalkTag.done('核心库打包完毕') - resolve(PROJECT) + chalkTag.done(project + '核心库打包完毕') + resolve() }) } else { - chalkTag.done('核心库无打包') - resolve(PROJECT) + chalkTag.done(project + '核心库无打包') + resolve() } }) - }).then(prj => { - apps = [] - // return findApp("packages", file => { - // if (/.*\\(App[^\\]+)\.vue/g.test(file)) { - // let fileName = file.replace(/.*\\(App[^\\]+)\.vue/g, '$1') - // apps.push({name: fileName, component: file.replace(/\\/g, "/")}) - // log(">>>正在打包业务应用...%s", fileName) - // } - // }).then(() => { - // chalkTag.done('业务应用打包完毕') - // return prj - // }) - return prj - }).then(prj => new Promise(resolve => { - chalkTag.info('正在生成打包文件...') - let bin = path.join(__dirname, prj.toString(), 'index.js'), - coreApps = cores.map(e => `{name:'${e.name}',component:require('../../${e.component}').default}`), - bizApps = apps.map(e => `{name:'${e.name}',component:require('../../${e.component}').default}`), - comps = [...coreApps, ...bizApps], - content = ` + }) + const getApps = new Promise(resolve => { + const appLib = path.join(__dirname, project.toString(), 'apps.import.json') + fsExtra.readJson(appLib, (err, data) => { + chalkTag.info(project + '加载业务应用配置...') + apps = [] + let appDir = "packages" + if (data) { + findApp(appDir, file => { + let fileName = file.replace(/.*\\(.+)\.vue/g, '$1') + if (Object.keys(data).includes(fileName)) { + apps.push({name: fileName, component: file.replace(/\\/g, "/")}) + } + }).then(() => { + chalkTag.done(project + '业务应用打包完毕') + resolve() + }) + } else { + chalkTag.done(project + '业务应用无打包') + resolve() + } + }) + }) + return new Promise(resolve => { + Promise.all([getCores, getApps]).then(() => { + chalkTag.info(project + '正在生成打包文件...') + let bin = path.join(__dirname, project.toString(), 'index.js'), + coreApps = cores.map(e => `{name:'${e.name}',component:require('../../${e.component}').default}`), + bizApps = apps.map(e => `{name:'${e.name}',component:require('../../${e.component}').default}`), + comps = [...coreApps, ...bizApps], + content = ` const apps = [${comps.toString()}] const install = function (Vue) { if (install.installed) return Promise.resolve() @@ -129,39 +151,21 @@ const start = () => { install } ` - fsExtra.outputFile(bin, content, err => { - if (err) { - chalkTag.error(err) - } else chalkTag.done('生成打包文件') - resolve(prj) - }) - })).then(project => new Promise(resolve => { - fsExtra.readJson(path.join(__dirname, project.toString(), 'package.json'), (err, json) => { - let cmd = `vue-cli-service build --target lib --dest project/${project}/dist project/${project}/index.js --name ${json.name}` - chalkTag.info('正在压缩文件中...') - exec(cmd, { - cwd: path.join(__dirname, '..') - }, (err, stdout) => { - log(stdout); - if (!err) { - chalkTag.done('打包成功!') - resolve(project) - } else { - chalkTag.error(err) - } + fsExtra.outputFile(bin, content, err => { + if (err) chalkTag.error(err) + else chalkTag.done(project + '生成打包文件') + resolve() }) }) - })).then(project => { - chalkTag.info('正在发布中...') - let cmd = `npm unpublish dvcp-sass-apps@1.0.0 --force&&npm publish` - exec(cmd, { - cwd: path.join(__dirname, project) - }, (err, stdout) => { - log(stdout); - if (!err) { - chalkTag.done('发布成功!') - } else chalkTag.error(err) + }) + +} +const start = () => { + //询问打包哪个项目 + init().then(choices => { + return Promise.all(choices.map(prj => generateMain(prj))).then(() => { + chalkTag.done('完成生成打包文件') }) }) } -start() +start();