前言
Moon-cli是Moon项目的脚手架工具,类似于vue-cli,用于创建Moon项目,本文主要是分析Moon-cli源码,看看类似的脚手架工具的实现思路。
具体分析
首先看看Moon-cli实例的整个处理,具体处理如下:
在阅读Moon-cli源码之后,主要实现的点就是三个部分:
- package.json
- Moon文件
- load.js
package.json中部分如下:
// 程序入口
"main": "bin/moon",
// 将moon加入PATH中
"bin": {
"moon": "./bin/moon"
}
由package.json这部分可以知道,当执行moon命令时会查找moon文件,而moon文件中必然定义了诸如init命令,那么就以moon init test命令为例来分析整个moon文件中的处理流程。
moon文件
moon是Moon-cli脚手架工具的核心文件,moon文件是node文件,整个的处理流程如下:
moon init test
上面会调用init命令,源码中相关处理如下,代码如下:
// 首先会调用intro: 该函数仅仅是输出字符=====Moon====
intro();
// command是获取命令行的参数数组
// command = process.argv.slice(2);
switch (command[0]) {
// moon --help| -h | help
case "--help":
case "help":
case undefined:
help();
break;
case "-h":
help();
break;
// moon -v | --version
case "-v":
version();
break;
case "--version":
version();
break;
// moon init
case "init":
if(command[1]) {
init(command[1]);
} else {
err("Please provide an app name");
}
break;
default:
err("Command Not Found");
}
从上面的代码中可以看出moon支持的命令就是三种:帮助命令、版本信息、init命令
从上面可以看出init命令主要的处理是调用init函数来实现的。
moon init test —-> init(‘test’)
init函数
实际上init中是调用info函数来处理,info函数中是用于处理创建者自定义作者(author)、项目描述(description)、版本(version),之后执行回调函数。
init(‘test’) —-> info(function(opts) {// 具体处理})
而init中传递给info中的回调函数中调用load模块以及download-git-repo模块相关方法,用于下载template。
info函数
该函数是处理author、version、description,内部实际上会调用ask函数来处理相关流程,在ask函数中会调用async相关函数处理用户输入。
moon init 命令整个的处理流程
总结
Moon-cli脚手架工具是使用nodeJs构建的CLI交互处理程序,通过阅读其源代码了解了其处理逻辑,具体的处理步骤会在源码中详细注释。