create-bfe-cttq
Version:
CTTQ大前端脚手架项目
92 lines (86 loc) • 2.85 kB
JavaScript
const download = require("download-git-repo")
const fs = require('fs-extra');
const ora = require("ora")
const path = require("path")
const spinner = ora("template downloading...");
/**
* 模板下载
* @param {string} url 模板地址 参考--direct:https://gitlab.cttq.com/bfe-cli/cttq-template#vue2-pc-basic
* @param {string} name 绝对路径或者相对路径
* @param {boolean} showInfo 是否提示下载信息
* @returns Promise
*/
const downloadTemplate = (url, name, showInfo = true) => {
return new Promise((resolve, reject) => {
showInfo && spinner.start()
download(url, name, (err) => {
if (err) {
showInfo && spinner.fail("template download failed!!!");
reject(err);
} else {
showInfo && spinner.succeed("template download success!!!");
resolve(true);
}
})
})
}
/**
* 删除指定目录
* @param {string | Array<string>} targetDir 支持单个和多个目录
* @returns Promise
*/
const removeDirectory = (targetDir) => {
return new Promise((resolve, reject) => {
try {
const target = Array.isArray(targetDir) ? targetDir : [targetDir];
for (let i = 0; i < target.length; i++) {
fs.removeSync(target[i])
}
resolve()
} catch (error) {
reject(error)
}
})
}
/**
* 多模板下载
* @param {Array<string>} repos 多个地址-数组
* @param {string} targetDir 目标目录
* @returns Promise
*/
const multipleDownload = (repos, targetDir) => {
return new Promise(async (resolve, rejcet) => {
spinner.start();
// 临时目录名
const tempDir = []
try {
// 循环下载模板库
for (let i = 0; i < repos.length; i++) {
// 存放临时目录
tempDir.push(fs.mkdtempSync(path.join(__dirname, 'temp-')))
// 获取下载结果
if (await downloadTemplate(repos[i], tempDir[i], false)) {
// 读取文件目录
const files = fs.readdirSync(tempDir[i])[0];
// 复制文件到指定目录
fs.copySync(path.resolve(tempDir[i], files), path.resolve(targetDir, files));
// 清除临时目录
removeDirectory(tempDir[i])
}
}
// 提示模板下载成功
spinner.succeed("template download success!!!")
// 结束
resolve(true)
} catch (error) {
spinner.stop("")
removeDirectory(tempDir)
rejcet(`File write failed: ${error}`)
}
})
}
module.exports = {
downloadTemplate,
removeDirectory,
multipleDownload
}