UNPKG

zc-project

Version:

项目模板

436 lines (435 loc) 19.4 kB
const fs = require('fs') // 文件读写 const chalk = require('chalk') const download = require('download-git-repo'); const ora = require('ora'); const spinner = ora('Loading undead unicorns'); const javaUrl='http://gitee.com/micro_3/zcii-cloud-ems.git' const vueUrl='https://gitee.com/micro_3/zcii-cloud-web-ems.git' const h5Url='https://gitee.com/micro_3/zcii-cloud-h5-ems.git' var tool={ down(url,dest){ return new Promise((resolve, reject) => { spinner.start('开始下载'); download('direct:'+url,dest, { clone: true }, (err) => { if (err) { spinner.fail(chalk.red('下载失败 \n' + err)); process.exit(); } else { spinner.succeed(chalk.green(`下载成功`)); resolve(); } }); }); }, createJava:function(answers){ // console.log(answers) this.clearDir(answers.dir) this.down(javaUrl,answers.dir).then(res=>{ this.updateDirectSync(answers); try{ this.updatePackageSync({...answers,path:answers.dir}); console.log(chalk.green('包名修改成功')); }catch(ex){ console.error("包名修改失败",ex) throw ex; } console.log(chalk.green("项目初始化成功")) }) }, createVue3:function(answers){ // console.log(answers) this.clearDir(answers.dir) this.down(vueUrl,answers.dir).then(res=>{ this.updatePkgSync(answers); this.updateEnvSync(answers,'.env'); this.updateEnvSync(answers,'.env.prod'); this.updateEnvSync(answers,'.env.test'); this.updateYamlSync(answers,'zcii-cloud-web-ems-k8s-dev.yaml'); this.updateYamlSync(answers,'zcii-cloud-web-ems-k8s-pro.yaml'); console.log(chalk.green("项目初始化成功")) }) }, createH5:function(answers){ // console.log(answers) this.clearDir(answers.dir) this.down(h5Url,answers.dir).then(res=>{ this.updateFileSync(answers,'dist/dev.sh'); this.updateFileSync(answers,'dist/prod.sh'); this.updateFileSync(answers,'config.js'); this.updateFileSync(answers,'manifest.json'); this.updateFileSync(answers,'app.vue'); this.updateFileSync(answers,'components/task/task.vue'); this.updateYamlSync(answers,'dist/zcii-cloud-k8s-h5-ems.yaml'); }) }, add:function(answers){ //1.修改rush.json //this.rushAdd(answers) //2.apps/master/src/router/modules/remaining.ts修改 //this.routeAdd(answers) //3.apps/master/src/permission.ts修改 this.permissionAdd(answers) //4.nginx.template修改 this.nginxAdd(answers) }, delete:function(answers){}, updatePkg:function(answers){ // 修改package.json fs.readFile(`${answers.dir}/package.json`, 'utf8', (err, data) => { if (err) throw err; const packageJson = JSON.parse(data); packageJson.name = answers.name; packageJson.version = answers.version; packageJson.description = answers.description; packageJson.author = answers.author; packageJson.route = answers.name+"Ms" fs.writeFile(`${answers.dir}/package.json`, JSON.stringify(packageJson, null, 2), (err) => { if (err) throw err; console.log(chalk.green('package.json修改成功')); }); }); }, updateEnv:function(answers){ // 修改.env fs.readFile(`${answers.dir}/.env`, 'utf8', (err, data) => { if (err) throw err; let env = data.replace(/VITE_PORT=.*/g, `VITE_PORT=${answers.port}`); env = env.replace(/VITE_ACTIVE_RULE=.*/g, `VITE_ACTIVE_RULE='/${answers.name}'`); env = env.replace(/VITE_APP_TITLE=.*/g, `VITE_APP_TITLE=${answers.title}`); fs.writeFile(`${answers.dir}/.env`, env, (err) => { if (err) throw err; console.log(chalk.green('.env修改成功')); }); }); }, updatePkgSync:function(answers){ try{ data=fs.readFileSync(`${answers.dir}/package.json`, 'utf8') const packageJson = JSON.parse(data); packageJson.name = answers.name; packageJson.version = answers.version; packageJson.description = answers.description; packageJson.author = answers.author; packageJson.route = answers.name+"Ms" fs.writeFileSync(`${answers.dir}/package.json`, JSON.stringify(packageJson, null, 2)); console.log(chalk.green('package.json修改成功')); }catch(ex){ console.error("package.json修改失败",ex) throw ex; } }, updateEnvSync:function(answers,file){ try{ data=fs.readFileSync(`${answers.dir}/${file}`, 'utf8') let env = data.replace(/VITE_PORT=.*/g, `VITE_PORT=${answers.port}`); env = env.replace(/VITE_ACTIVE_RULE=.*/g, `VITE_ACTIVE_RULE='/${answers.name}'`); env = env.replace(/VITE_APP_TITLE=.*/g, `VITE_APP_TITLE=${answers.title}`); env = env.replace(/energy/g,answers.name) fs.writeFileSync(`${answers.dir}/${file}`, env); console.log(chalk.green(`${file}修改成功`)); }catch(ex){ console.error(".env修改失败",ex) throw ex; } }, updateYamlSync:function(answers,file){ try{ const path=answers.dir const filePath=`${path}/${file}` data=fs.readFileSync(filePath, 'utf8') data=data.replace(/ems/g,answers.name) data=data.replace(/49002/g,answers.port) newFile=file.replace(/ems/g, answers.name) newFilePath=`${path}/${newFile}` fs.renameSync(filePath, newFilePath); fs.writeFileSync(newFilePath, data); console.log(chalk.green(`${file}修改成功`)); }catch(ex){ console.error(`${file}修改失败`,ex) throw ex; } }, updateFileSync:function(answers,file){ try{ const path=answers.dir const filePath=`${path}/${file}` data=fs.readFileSync(filePath, 'utf8') data=data.replace(/ems/g,answers.name) data=data.replace(/株齿云EMS/g,answers.title) data=data.replace(/49002/g,answers.port) fs.writeFileSync(filePath, data); console.log(chalk.green(`${file}修改成功`)); }catch(ex){ console.error(`${file}修改失败`,ex) throw ex; } }, updateDirectSync:function(answers){ try{ moduleName=answers.name.split('-').pop() oldPkg="/src/main/java/com/zhuchi/zcii/module/ems" group='com/zhuchi/zcii/module/'+answers.name if(answers.group){ group=answers.group.replaceAll('\.','//') } newPkg=`/src/main/java/${group}` newName=moduleName.charAt(0).toUpperCase()+answers.name.slice(1)//首字母大写项目名称 gIndex=newName.indexOf("-") if(gIndex>0){ newName=newName.substring(0,gIndex)+newName.charAt(gIndex+1).toUpperCase()+newName.slice(gIndex+2) } //运行程序修改 fs.renameSync(answers.dir+"/zcii-cloud-ems-biz"+oldPkg+"/EmsServerApplication.java",answers.dir+"/zcii-cloud-ems-biz"+oldPkg+"/"+newName+"ServerApplication.java") fs.renameSync(answers.dir+"/zcii-cloud-ems-api",answers.dir+`/${answers.dir}-api`) fs.renameSync(answers.dir+"/zcii-cloud-ems-biz",answers.dir+`/${answers.dir}-biz`) if(answers.group){ fs.cpSync(answers.dir+`/${answers.dir}-api`+oldPkg,answers.dir+`/${answers.dir}-api`+newPkg,{recursive: true}) fs.cpSync(answers.dir+`/${answers.dir}-biz`+oldPkg,answers.dir+`/${answers.dir}-biz`+newPkg,{recursive: true}) //删除旧目录 //判别newPkg与oldPkg什么时候开始不同 // 按路径分隔符拆分文件夹列表 old_folders = 'com/zhuchi/zcii/module/ems'.split('/') new_folders = group.split('/') // 获取最小深度,避免越界 min_depth = Math.min(old_folders.length, new_folders.length) var ind=0; for(var i=0;i<min_depth;i++){ if(old_folders[i]!=new_folders[i]){ ind=i; break } } const oldPath='/src/main/java/'+old_folders.slice(0,ind+1).join('/') fs.rmSync(answers.dir+`/${answers.dir}-api`+oldPath,{force: true,recursive: true}) fs.rmSync(answers.dir+`/${answers.dir}-biz`+oldPath,{force: true,recursive: true}) console.log(chalk.green('目录修改成功')); }else{ fs.cpSync(answers.dir+`/${answers.dir}-api`+oldPkg,answers.dir+`/${answers.dir}-api`+newPkg,{recursive: true}) fs.cpSync(answers.dir+`/${answers.dir}-biz`+oldPkg,answers.dir+`/${answers.dir}-biz`+newPkg,{recursive: true}) //删除旧目录 //判别newPkg与oldPkg什么时候开始不同 // 按路径分隔符拆分文件夹列表 old_folders = 'com/zhuchi/zcii/module/ems'.split('/') new_folders = group.split('/') // 获取最小深度,避免越界 min_depth = Math.min(old_folders.length, new_folders.length) var ind=0; for(var i=0;i<min_depth;i++){ if(old_folders[i]!=new_folders[i]){ ind=i; break } } const oldPath='/src/main/java/'+old_folders.join('/') fs.rmSync(answers.dir+`/${answers.dir}-api`+oldPath,{force: true,recursive: true}) fs.rmSync(answers.dir+`/${answers.dir}-biz`+oldPath,{force: true,recursive: true}) console.log(chalk.green('目录修改成功')); } }catch(ex){ console.error("目录修改失败",ex) throw ex; } }, updatePackageSync:function(answers){ //读取所有文件 const path=answers.path const files = fs.readdirSync(path); files.forEach(file => { // console.log("文件:",file) const filePath = `${path}/${file}`; const stats = fs.statSync(filePath); if (!stats.isDirectory()) { moduleName=answers.name.split('-').pop() newName=moduleName.charAt(0).toUpperCase()+answers.name.slice(1)//首字母大写项目名称 gIndex=newName.indexOf("-") if(gIndex>0){ newName=newName.substring(0,gIndex)+newName.charAt(gIndex+1).toUpperCase()+newName.slice(gIndex+2) } let data=fs.readFileSync(filePath, 'utf8') if(file=='bootstrap.yaml'){ data=data.replace(/zcii-ems-server/g,answers.dir) data=data.replace(/ port:.*/g, ` port: ${answers.port}`) fs.writeFileSync(filePath, data); }else if(file=='zcii-ems-server.yaml'){ if(answers.group){ data=data.replace(/com\.zhuchi\.zcii\.module\.ems/g, answers.group) } data=data.replace(/ems/g,answers.name) newFile=file.replace(/zcii-ems-server/g, answers.dir) newFilePath=`${path}/${newFile}` fs.renameSync(filePath, newFilePath); fs.writeFileSync(newFilePath, data); }else if(file=='zcii-cloud-ems-k8s-pro.yaml'||file=='zcii-cloud-ems-k8s-dev.yaml'){ data=data.replace(/zcii-cloud-ems/g,answers.dir) data=data.replace(/48088/g,answers.port) newFile=file.replace(/zcii-cloud-ems/g, answers.dir) newFilePath=`${path}/${newFile}` fs.renameSync(filePath, newFilePath); fs.writeFileSync(newFilePath, data); }else if(file=='Dockerfile'){ data=data.replace(/zcii-cloud-ems/g,answers.dir) data=data.replace(/EXPOSE .*/g, `EXPOSE ${answers.port}`) fs.writeFileSync(filePath, data); }else{ //zcii-cloud-ems替换为answers.dir data=data.replace(/zcii-cloud-ems/g, answers.dir) //标题替换 data=data.replace(/能源管理/g, `${answers.title}`) //package名修改 if(answers.group){ data=data.replace(/com\.zhuchi\.zcii\.module\.ems/g, answers.group) } //Ems内容修改 data=data.replace(/Ems/g,newName) data=data.replace(/ems/g,answers.name) data=data.replace(/EMS/g,answers.name.toUpperCase()) //文件名修改 if(file.indexOf("Ems")>-1){ newFile=file.replace(/Ems/g, newName) newFilePath=`${path}/${newFile}` fs.renameSync(filePath, newFilePath); fs.writeFileSync(newFilePath, data); }else{ fs.writeFileSync(filePath, data); } } }else{ this.updatePackageSync({...answers,path:filePath}) } }); }, /** * 清空指定路径下的所有文件及文件夹 * @param {*} path */ clearDir:function(path){ if(fs.existsSync(path)){ this.emptyDir(path); this.rmEmptyDir(path,1); } }, /** * 删除文件夹下所有问价及将文件夹下所有文件清空 * @param {*} path */ emptyDir:function(path){ const files = fs.readdirSync(path); files.forEach(file => { const filePath = `${path}/${file}`; const stats = fs.statSync(filePath); if (stats.isDirectory()) { this.emptyDir(filePath); } else { fs.unlinkSync(filePath); // console.log(`删除${file}文件成功`); } }); }, /** * 删除指定路径下的所有空文件夹 * @param {*} path */ rmEmptyDir:function(path,level=0){ const files = fs.readdirSync(path); if (files.length > 0) { let tempFile = 0; files.forEach(file => { tempFile++; this.rmEmptyDir(`${path}/${file}`, 1); }); if (tempFile === files.length && level !== 0) { fs.rmdirSync(path); } } else { level !==0 && fs.rmdirSync(path); } }, rushAdd:function(answers){ try{ let filePath='rush.json' let rush=fs.readFileSync(filePath,"utf-8") let json=JSON.parse(rush) json.projects.push({ "packageName":answers.name, "projectFolder":"apps/"+answers.dir, "reviewCategory": "project", "tags":[answers.name] }) fs.writeFileSync(filePath,JSON.stringify(json,null,2)) }catch(ex){ console.error("rush.json新增失败",ex) throw ex; } }, rushDel:function(answers){ try{ let filePath='rush.json' let rush=fs.readFileSync(filePath,"utf-8") let json=JSON.parse(rush) json.projects=json.projects.filter(item=>item.packageName!=answers.name) fs.writeFileSync(filePath,JSON.stringify(json)) }catch(ex){ console.error("rush.json删除失败",ex) throw ex; } }, routeAdd:function(answers){ try{ let filePath='apps/master/src/router/modules/remaining.ts' let route=fs.readFileSync(filePath,"utf-8") const newName=answers.name.charAt(0).toUpperCase()+answers.name.slice(1) let routeStr=`,{path:'/${answers.name}/:pathMatch(.*)*',name:'${answers.name}',meta:{hidden:true,},component:()=>import('@/components/SubContainer/index.vue')}` let ssoStr=`,{path:'/${answers.name}-sso',component:()=>import('@/views/Login/ZciiLogin.vue'),name:'${newName}Login',meta:{hidden:true,title:t('router.zciiLogin'),noTagsView:true}}` let tag='//tag' let result=route.replace(tag,routeStr+'\n '+ssoStr+'\n '+tag) fs.writeFileSync(filePath,JSON.stringify(result)) }catch(ex){ console.error("route新增失败",ex); throw ex; } }, routeDel:function(answers){ try{ let route=fs.readFileSync('apps/master/src/router/modules/remaining.ts',"utf-8") const newName=answers.name.charAt(0).toUpperCase()+answers.name.slice(1) let routeStr=`,{path:'/${answers.name}/:pathMatch(.*)*',name:'${answers.name}',meta:{hidden:true,},component:()=>import('@/components/SubContainer/index.vue')}` let ssoStr=`,{path:'/${answers.name}-sso',component:()=>import('@/views/Login/ZciiLogin.vue'),name:'${newName}Login',meta:{hidden:true,title:t('router.zciiLogin'),noTagsView:true}}` let result=route.replace(' '+routeStr,'').replace(' '+ssoStr,'') fs.writeFileSync(filePath,JSON.stringify(result)) }catch(ex){ console.error("route删除失败",ex) throw ex; } }, permissionAdd:function(answers){ try{ }catch(ex){ console.error("permission新增失败",ex) throw ex; } }, permissionDel:function(answers){ try{ }catch(ex){ console.error("permission删除失败",ex) throw ex; } }, nginxAdd:function(answers){ try{ }catch(ex){ console.error("nginx新增失败",ex) throw ex; } }, nginxDel:function(answers){ try{ }catch(ex){ console.error("nginx删除失败",ex) throw ex; } }, } module.exports=tool