Skip to content

关于

开发nodejs命令行应用一般会涉及到以下几个方面:

MixCli基于commanderpromptslogsets,提供命令行解析、自动交互提示以及终端界面增强等功能。

主要特性:

  • commander提供命令行解析
  • prompts提供交互提示
  • logsets提供终端输出增强组件
  • 自动为命令行选项推断生成交互提示
  • 自动搜索当前依赖下符合条件的命令进行合并,适合于monorepo项目开发

自动生成交互提示

为命令行命令选项推断生成交互提示

当我们使用commander开始命令行时,一般会这样写:

js
const { program } = require('commander');
program 
    .option("-p,--port <port>","指定端口号",3000)                      
    .option("-d,--debug" ,"调试模式",false)      
    .option("-h,--host <host>","指定主机名")      
    .option("-m,--mode <mode>","指定模式") // 可选值"development","production","test","debug"
    .action((options)=>{
      console.log(options)
    })
program.parse();
const { program } = require('commander');
program 
    .option("-p,--port <port>","指定端口号",3000)                      
    .option("-d,--debug" ,"调试模式",false)      
    .option("-h,--host <host>","指定主机名")      
    .option("-m,--mode <mode>","指定模式") // 可选值"development","production","test","debug"
    .action((options)=>{
      console.log(options)
    })
program.parse();

以上代码中--host--mode是必填项,而--port--debug是可选项。 正常情况下,如果用户没有指定--host--mode,则只会简单地提示出错退出。

  • 我们希望在用户没有指定--host--mode时,能够自动交互提示用户输入--host--mode的值。
  • 如果选择指定了choices,则希望能够自动提示用户选择choices中的值。
  • 如果是boolean值,则希望能够自动提示用户选择yesno

总之,我们希望交互体验更加友好!

MixCli的作用就是为命令行应用的选项自动推断生成交互提示,当用户没有指定--host--mode选项时,按照一定的推断规则(根据选项的值、choices等),会自动使用prompts提供的交互提示,提示引导用户输入--host--mode选项的值。

多包命令混合

搜索当前依赖下符合条件包的命令进行混合

在开发基于monorepo的应用时,我们需要配套开发一个cli应用,一般我们会单独创建一个包位于packages/cli,然后在package.json中配置bin字段,然后在bin目录下创建一个cli.js文件,然后在cli.js中使用commander来编写命令行应用。

json
{
  "name": "@myapp/cli",
  "version": "1.0.0",
  "bin": {
    "myapp": "bin/cli.js"
  }
}
{
  "name": "@myapp/cli",
  "version": "1.0.0",
  "bin": {
    "myapp": "bin/cli.js"
  }
}

然后,当安装了@myapp/cli后,就可以在命令行中使用myapp命令了。

现在问题来,假设我们在@myapp这个monorepo工程中,还存在@myapp/core@myapp/app@myapp/vue@myapp/react等包, 并且每个包均提供了相应的命令行命令,我们想实现:

  • 只安装@myapp/cli就可以启用所有@myapp/*包提供的命令行。
  • 各个包的命令声明在各自的包中,而不是在@myapp/cli中。比如@myapp/vue包的命令声明在@myapp/vue包中,而不是在@myapp/cli中。
  • 能按安装的@myapp/*依赖自动扩充@myapp/cli的命令。

举例:

  • packages/vue/cli/x.js中声明了一个x命令,
  • packages/react/cli/y.js中声明了一个y命令,

当一个应用安装了@myapp/vue后,就可以在命令行中使用myapp x命令了。 当一个应用安装了@myapp/react后,就可以在命令行中使用myapp y命令了。

MixCli可以让您开发一个cli应用,当安装了@myapp/cli后,启动时可以自动搜索当前工程下符合条件的依赖下的命令进行混合,提供完整动态的命令行。