UNPKG

quick-create-app-cli

Version:

前端基础建设模版脚手架,快速搭建PC、HybridApp、微信小程序、微前端等项目

166 lines (146 loc) 4.52 kB
const { logSymbols, chalk } = require('./utils/dependencies') const { resolvePath, pathExists, copyFileToPath, createLoadSpinner, removeFile, replaceTemplates, executeCommand } = require('./utils/index') //文件获取 const { downloadTemplate, cloneTemplate } = require('./clone') //检查本地是否重名 const isCheckProjectNameRepetition = async function (projectName) { if (projectName && projectName.length) { try { let isExist = await pathExists(projectName) if (isExist) { //文件夹重名 console.log(logSymbols.error, chalk.red('The project already exists.')) process.exit() } else { return Promise.resolve(projectName) } } catch (error) { console.error(error) process.exit() } } else { console.error(`请输入项目名称`) process.exit() } } //下载项目 async function downloadProjectTemplate(meta) { //加载动画 let spinner = createLoadSpinner('Initializing project...') //模版文件夹地址 let templatePath = resolvePath(`../template/`) try { let fileDirPath = `${templatePath}/${meta.fileDirName}` // 返回 Node.js 进程的当前工作目录 let processPath = process.cwd() //项目名称 let projectName = meta.projectName.toLowerCase() //项目地址 let targetPath = `${processPath}/${projectName}` //判断模板路径是否存在,否则下载 let isExist = await pathExists(fileDirPath) if (!isExist) { await downloadTemplate(meta.fileUrl, templatePath) } //复制文件并移除模版文件夹 await copyFileToPath(fileDirPath, targetPath) removeFile(templatePath) //替换模版 let packagePath = `${targetPath}/package.json` //替换模版文件 await replaceTemplates( //替换package.json中的模版符号 { project_name: projectName }, packagePath ) //是否安装依赖 if (meta.platform === 'app' && meta.installed) { await executeCommand('cnpm', ['install'], targetPath) } else if (meta.platform === 'web' && meta.installed) { await executeCommand('qbnpm', ['install'], targetPath) } // 初始化项目模版成功 spinner.text = 'Initialize project successful.' spinner.succeed() console.log( `To get start: \n cd ${projectName} ${chalk.blue('npm install')} ${chalk.blue('npm run serve')} ` ) return Promise.resolve(targetPath) } catch (error) { //删除模版文件夹 removeFile(templatePath) spinner.text = chalk.red(`Initialize project failed. ${error}`) spinner.fail() process.exit() } } //拉取项目 const cloneProjectTemplate = async function (meta) { //加载动画 let spinner = createLoadSpinner('Initializing project...') try { //项目名称 let projectName = meta.projectName.toLowerCase() //本地模版地址 let templatePath = resolvePath(`../../${projectName}/`) console.log(templatePath) //判断模板路径是否存在,否则下载 let isExist = await pathExists(templatePath) if (!isExist) { await cloneTemplate(meta.fileUrl, templatePath, meta.cloneOptions) } //替换模版 let packagePath = `${templatePath}/package.json` //替换模版文件 await replaceTemplates( //替换package.json中的模版符号 { project_name: projectName }, packagePath ) //是否安装依赖(pc项目和micro项目默认使用qbnpm,app和微信小程序使用cnpm) if (meta.platform === 'pc' && meta.installed) { await executeCommand('qbnpm', ['install'], templatePath) } else if ( (meta.platform === 'app' || meta.platform === 'wechat') && meta.installed ) { await executeCommand('cnpm', ['install'], templatePath) } // 初始化项目模版成功 spinner.text = 'Initialize project successful.' spinner.succeed() console.log( `To get start: \n cd ${projectName} ${!meta.installed ? chalk.blue('npm install') : ''} ${chalk.blue('npm run serve')} ` ) return Promise.resolve(templatePath) } catch (error) { spinner.text = chalk.red(`Initialize project failed. ${error}`) spinner.fail() process.exit() } } module.exports = { isCheckProjectNameRepetition, downloadProjectTemplate, cloneProjectTemplate }