写一个自定义的脚手架的前奏

一直想写一个自己的脚手架,个人觉得脚手架核心就是输入命令行,然后各类的目录、文件、配置都给你自动生成好了,然后你直接开发业务就行,不需要进行过多的配置,总而言之,脚手架就是从已有的项目模板里复刻一份,然后在你执行命令的目录下生成这个项目,里面的目录文件就是那份模板的东西。

然后自己写了一个【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}文件已生成!`);

 

posted @ 2022-12-16 17:41  蛙仔  阅读(60)  评论(0编辑  收藏  举报