写一个自定义的脚手架的前奏
一直想写一个自己的脚手架,个人觉得脚手架核心就是输入命令行,然后各类的目录、文件、配置都给你自动生成好了,然后你直接开发业务就行,不需要进行过多的配置,总而言之,脚手架就是从已有的项目模板里复刻一份,然后在你执行命令的目录下生成这个项目,里面的目录文件就是那份模板的东西。
然后自己写了一个【simple-lsq-cli】,仓库地址:https://github.com/lishengqin/simple-lsq-cli,它实现的就是执行 【simple-lsq-cli】,然后会自动生成一个文件夹,文件夹里的内容就是复刻我的模板。
文件夹目录的格式如图下:
使用效果:
1. bin/simple-lsq-cli.js
这个文件本质就是个脚本,它的逻辑就是首先让用户输入创建文件夹的名称,判断是否已存在这个文件夹,然后在目录下生成这个文件夹,然后再循环读取【template】这个目录下的文件,并将其写入到生成的文件夹里面去,最后呈现的效果就是我执行完命令行,我的目录下自动生成一个文件夹,文件夹里的内容自动读取我的一个模板也自动生成了。
ps:一定要注意,这个js的第一行,一定要加 #!/usr/bin/env node ,不然执行这个命令没有反应。
2. package.json
bin里面可以写多个命令,每个命令指向对应的文件,然后全局安装后,执行每个命令,就相当于执行 【node 对应文件】。
配置可以改成私有,"private": true ,然后 【npm link】在本地发布,再【npx simple-lsq-cli 】使用。
3. 附上 simple-lsq-cli.js 代码
1 #!/usr/bin/env node 2 import path from 'path'; 3 import fs from 'fs'; 4 import inquirer from 'inquirer'; 5 import { fileURLToPath } from 'url'; 6 const __filename = fileURLToPath(import.meta.url); 7 const __dirname = path.dirname(__filename); 8 const templateUrl = `../template`; 9 function deleteFolder(filePath) { 10 let files = []; 11 if (fs.existsSync(filePath)) { 12 files = fs.readdirSync(filePath); 13 files.forEach(one => { 14 let currentPath = path.resolve(filePath, one); 15 if (fs.statSync(currentPath).isDirectory()) { 16 deleteFolder(currentPath); 17 } else { 18 fs.unlinkSync(currentPath); 19 } 20 }); 21 fs.rmdirSync(filePath); 22 } 23 } 24 25 const { dirName } = await inquirer.prompt([ 26 { 27 name: 'dirName', 28 type: 'input', 29 message: '文件夹名称', 30 }, 31 ]); 32 let toDirPath = path.resolve(process.cwd(), './' + dirName); 33 let exist = fs.existsSync(toDirPath); 34 if (exist) { 35 const { isCover } = await inquirer.prompt([ 36 { type: 'confirm', name: 'isCover', message: `目录下已存在${dirName},是否覆盖` }, 37 ]); 38 if (isCover) { 39 deleteFolder(toDirPath); 40 fs.mkdirSync(toDirPath); 41 } 42 } else { 43 fs.mkdirSync(toDirPath); 44 } 45 let files = fs.readdirSync(path.resolve(__dirname, templateUrl)); 46 files.forEach(file => { 47 let originFileUrl = path.resolve(__dirname, templateUrl, file); 48 const data = fs.readFileSync(originFileUrl, 'utf-8'); 49 fs.writeFileSync(path.resolve(toDirPath, file), data); 50 }); 51 console.log(`${dirName}文件已生成!`);