فهرست منبع

feat: 添加根据模板文件生成目标文件

liucong5 2 سال پیش
والد
کامیت
edd1323483

BIN
NodeJS/Image/021.png


+ 19 - 1
NodeJS/README.md

@@ -1264,6 +1264,8 @@ npm install yarn -g
 
 ## 实现自己的脚手架
 
+项目在 `TestJs/Custom_CLI` 文件夹中
+
 具有 自动拉去项目模板、安装项目依赖、打开浏览器`http://localhost:8080`、启动启动项目 功能
 
 ### 命令行直接运行自己的项目
@@ -1428,4 +1430,20 @@ childProcess.stdout.pipe(process.stdout)
 
 命令行是创建一个新的进程执行命令,所以命令的输出其实是在另一个进程中,为了将命令的输出显示到当前命令行窗口中需要将输入输出流进行绑定
 
-windows 跑这个命令工具库可能会出现一些问题,需要特殊处理解决
+windows 跑这个命令工具库可能会出现一些问题,需要特殊处理解决
+
+### 增加选项
+
+`inquirer` 库
+
+![](./Image/021.png)
+
+### 模板代码
+
+有些时候我们需要新建项目相关的文件,可能是组件、可能是其他的,像这种文件需要先提供模板,然后根据模板生成对应的文件
+
+模板使用 ejs 模板库即可,根据命令编译对剑的 ejs模板,将编译的结果写入到指定文件中
+
+[ejs语法文档](https://ejs.bootcss.com/)
+
+可以先将目标文件赋值一遍,将其中需要动态设置的部分替换成ejs的代码

+ 215 - 0
NodeJS/TestJS/Custom_CLI/package-lock.json

@@ -11,6 +11,7 @@
       "dependencies": {
         "commander": "^11.0.0",
         "download-git-repo": "^3.0.2",
+        "ejs": "^3.1.9",
         "open": "^9.1.0"
       },
       "bin": {
@@ -25,6 +26,17 @@
         "node": ">=4"
       }
     },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/archive-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/archive-type/-/archive-type-4.0.0.tgz",
@@ -44,6 +56,11 @@
         "node": ">=4"
       }
     },
+    "node_modules/async": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz",
+      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -174,6 +191,18 @@
         "node": ">=4"
       }
     },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/clone-response": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz",
@@ -182,6 +211,22 @@
         "mimic-response": "^1.0.0"
       }
     },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
     "node_modules/commander": {
       "version": "11.0.0",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-11.0.0.tgz",
@@ -456,6 +501,20 @@
       "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz",
       "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="
     },
+    "node_modules/ejs": {
+      "version": "3.1.9",
+      "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz",
+      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -546,6 +605,33 @@
         "node": ">=6"
       }
     },
+    "node_modules/filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "dependencies": {
+        "minimatch": "^5.0.1"
+      }
+    },
+    "node_modules/filelist/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -658,6 +744,14 @@
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
     },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/has-symbol-support-x": {
       "version": "1.4.2",
       "resolved": "https://registry.npmmirror.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
@@ -829,6 +923,23 @@
         "node": ">= 4"
       }
     },
+    "node_modules/jake": {
+      "version": "10.8.7",
+      "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz",
+      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+      "dependencies": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/json-buffer": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -1368,6 +1479,17 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/tar-stream": {
       "version": "1.6.2",
       "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-1.6.2.tgz",
@@ -1517,6 +1639,14 @@
       "resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.7.0.tgz",
       "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
     },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
     "archive-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/archive-type/-/archive-type-4.0.0.tgz",
@@ -1532,6 +1662,11 @@
         }
       }
     },
+    "async": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz",
+      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1646,6 +1781,15 @@
         "url-to-options": "^1.0.1"
       }
     },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
     "clone-response": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz",
@@ -1654,6 +1798,19 @@
         "mimic-response": "^1.0.0"
       }
     },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
     "commander": {
       "version": "11.0.0",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-11.0.0.tgz",
@@ -1875,6 +2032,14 @@
       "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz",
       "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="
     },
+    "ejs": {
+      "version": "3.1.9",
+      "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz",
+      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+      "requires": {
+        "jake": "^10.8.5"
+      }
+    },
     "end-of-stream": {
       "version": "1.4.4",
       "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -1946,6 +2111,32 @@
       "resolved": "https://registry.npmmirror.com/file-type/-/file-type-8.1.0.tgz",
       "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ=="
     },
+    "filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "requires": {
+        "minimatch": "^5.0.1"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "5.1.6",
+          "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
+      }
+    },
     "filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -2040,6 +2231,11 @@
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
     },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+    },
     "has-symbol-support-x": {
       "version": "1.4.2",
       "resolved": "https://registry.npmmirror.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
@@ -2168,6 +2364,17 @@
         "is-object": "^1.0.1"
       }
     },
+    "jake": {
+      "version": "10.8.7",
+      "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz",
+      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+      "requires": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      }
+    },
     "json-buffer": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -2586,6 +2793,14 @@
         "escape-string-regexp": "^1.0.2"
       }
     },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
     "tar-stream": {
       "version": "1.6.2",
       "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-1.6.2.tgz",

+ 1 - 0
NodeJS/TestJS/Custom_CLI/package.json

@@ -15,6 +15,7 @@
   "dependencies": {
     "commander": "^11.0.0",
     "download-git-repo": "^3.0.2",
+    "ejs": "^3.1.9",
     "open": "^9.1.0"
   }
 }

+ 13 - 2
NodeJS/TestJS/Custom_CLI/src/core/actions.js

@@ -1,8 +1,10 @@
 const { promisify } = require('util')
 const download = promisify(require('download-git-repo'))
-const { commandSpawn } = require('../utils/terminal')
 
+const { commandSpawn } = require('../utils/terminal')
 const { vueRepo } = require('../config/repo-config')
+const { compile } = require('../utils/util')
+
 
 const createProjectAction = async (project) => {
     // 1. clone 项目,使用 download-git-repo 下载项目
@@ -17,6 +19,15 @@ const createProjectAction = async (project) => {
     await commandSpawn(command, ['run', `serve`], { cwd: `./${project}`})
 }
 
+const addCpmAction = async (name, dest) => {
+    // 编译 ejs 模板
+    const result = await compile("component.vue.ejs", {name, lowerName: name.toLowerCase()})
+
+    // 将文件写入项目的指定路径
+    console.log(result);
+}
+
 module.exports = {
-    createProjectAction
+    createProjectAction,
+    addCpmAction
 }

+ 6 - 1
NodeJS/TestJS/Custom_CLI/src/core/create.js

@@ -1,5 +1,5 @@
 const program = require("commander")
-const {createProjectAction} = require('./actions')
+const {createProjectAction, addCpmAction} = require('./actions')
 
 const createCommand = () => {
     // custom-cli create demo
@@ -11,6 +11,11 @@ const createCommand = () => {
             // 将命令与操作拆分到不同的文件中
             createProjectAction(project);
         })
+
+    program
+        .command(`addCpn <name>`)
+        .description(`创建指定类型的文件模板 根据名称进行替换`)
+        .action(addCpmAction)
 }
 
 module.exports = createCommand

+ 41 - 0
NodeJS/TestJS/Custom_CLI/src/template/component.vue.ejs

@@ -0,0 +1,41 @@
+<template>
+  <div class="<%= data.lowerName %>">
+    <h2>{{ message }}</h2>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "<%= data.name %>",
+    components: {
+
+    },
+    mixins: [],
+    props: {
+
+    },
+    data: function() {
+      return {
+        message: "Hello <%= data.name %>"
+      }
+    },
+    created: function() {
+
+    },
+    mounted: function() {
+
+    },
+    computed: {
+
+    },
+    methods: {
+
+    }
+  }
+</script>
+
+<style scoped>
+  .<%= data.lowerName %> {
+
+  }
+</style>

+ 22 - 0
NodeJS/TestJS/Custom_CLI/src/utils/util.js

@@ -0,0 +1,22 @@
+const ejs = require('ejs')
+const path = require('path')
+
+const compile = (template, data) => {
+    const templatePosition = `../template/${template}`
+    const templatePath = path.resolve(__dirname, templatePosition)
+    // console.log(templatePath)
+    return new Promise((resolve, reject) => {
+        ejs.renderFile(templatePath, {data}, {}, (err, result) => {
+            if(err) {
+                reject(err);
+                return;
+            }
+
+            resolve(result);
+        })
+    })
+}
+
+module.exports = {
+    compile
+}