Moon系列之Moon-cli

前言

Moon-cli是Moon项目的脚手架工具,类似于vue-cli,用于创建Moon项目,本文主要是分析Moon-cli源码,看看类似的脚手架工具的实现思路。

具体分析

首先看看Moon-cli实例的整个处理,具体处理如下:
具体流程

在阅读Moon-cli源码之后,主要实现的点就是三个部分:

  1. package.json
  2. Moon文件
  3. 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交互处理程序,通过阅读其源代码了解了其处理逻辑,具体的处理步骤会在源码中详细注释。

猜你喜欢

转载自blog.csdn.net/s1879046/article/details/79194741