六、 shell实现拉取代码(或者用download-git-repo)
同样还是在index.js中,拉取代码到本地。
const initAction = () => { inquirer.prompt( question.create ).then( async answers => { // shell脚本 console.log('项目名为:', answers.name); console.log('正在拷贝项目,请稍等-------') const remote = "https://github.com/zbsguilai/catui.git"//克隆地址 const currentName = "guilai-test" const targetName = answers.name; shell.exec(` git clone ${remote} --depth=1 mv ${currentName} ${targetName} rm -rf ./${targetName}/.git cd ${targetName} yarn `, (error, stdout, stderr) => { if (error) { console.error(`exec error:${error}`) } console.log(stdout) console.log(stderr) console.log("项目拷贝成功啦---------") }) }).catch(error => { red(`❌ 程序出错 ❌`) process.exit(1); }); }
七、download-git-repo实现拉取代码(或者用shelljs)
在bin下新建create文件
- process.exit(code)方法用于通过NodeJS中的退出代码结束同时运行的进程。
参数:code:它可以是0或1。0表示没有任何类型的故障结束进程,而1表示由于某种故障而结束进程。
const download = require('download-git-repo') const ora = require('ora') const fse = require('fs-extra') const handlebars = require('handlebars') const myChalk = require('chalk') const { red, yellow, green } = myChalk function createProject(project) { //获取用户输入,选择的信息 const { template, name, desc } = project; const spinner = ora("正在拉取框架..."); spinner.start(); download(template, name,{ clone: true }, async err => { if (err) { red(err); spinner.text = red(`拉取失败. ${err}`) spinner.fail() process.exit(1); } else { spinner.text = green(`拉取成功...`) spinner.succeed() spinner.text = yellow('请稍等,. 正在替换package.json中的项目名称、描述...') const multiMeta = { project_name: name, project_desc: desc } const multiFiles = [ `${name}/package.json` ] // 用条件循环把模板字符替换到文件去 for (var i = 0; i < multiFiles.length; i++) { // 这里记得 try {} catch {} 哦,以便出错时可以终止掉 Spinner try { // 等待读取文件 const multiFilesContent = await fse.readFile(multiFiles[i], 'utf8') // 等待替换文件,handlebars.compile(原文件内容)(模板字符) const multiFilesResult = await handlebars.compile(multiFilesContent)(multiMeta) // 等待输出文件 await fse.outputFile(multiFiles[i], multiFilesResult) } catch (err) { // 如果出错,Spinner 就改变文字信息 spinner.text = red(`项目创建失败. ${err}`) // 终止等待动画并显示 X 标志 spinner.fail() // 退出进程 process.exit(1) } } // 如果成功,Spinner 就改变文字信息 spinner.text = yellow(`项目已创建成功!`) // 终止等待动画并显示 ✔ 标志 spinner.succeed() } }); } module.exports = createProject
index.js
const initAction = () => { inquirer.prompt( question.create ).then( async answers => { if (answers.conf) { createProject(answers) } else { red(`🆘 您已经终止此操作 🆘`) } }).catch(error => { red(`❌ 程序出错 ❌`) process.exit(1); }); }
八、NPM发布
在此之前,博主有详细介绍将本地项目发布到npm,详细见本人底部
npm login//登录 npm publish//发布 • 1 • 2
九、优化脚手架
- 使用ora实现动画效果(见上)
- 使用chalk美化字体(见上)