quick-create-app-cli
Version:
前端基础建设模版脚手架,快速搭建PC、HybridApp、微信小程序、微前端等项目
166 lines (146 loc) • 4.52 kB
JavaScript
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
}