使用Node.js(TypeScript),cac和inquirer.js快速创建CLI

首先

找到了在使用Nodejs创建CLI工具时很有用的包,尝试使用后感觉不错,现在来介绍一下。

使用过的包裹

cac – 咖啡

创建一个简洁而强大的命令行界面框架。

https://www.npmjs.com/package/cac的中文释义如下:

inquirer.js是一个JavaScript库。

整合对话型界面非常方便。

以下是有关inquirer的npm包的链接:https://www.npmjs.com/package/inquirer

完成安装

$ npm i cac inquirer
$ npm i --save-dev @types/inquirer

样本

我将使用 Cac 写一个 CLI 的框架。
在下面的例子中,我让当输入类似 “cli hello hoge” 这样的命令时执行相应的处理。

import index from '../src/index'
import cac from 'cac'

const cli = cac()

cli.command('hello [name]', 'Enter your name').action(() => {
  index()
})

cli.help()
cli.parse()

我们将使用inquirer来定义交互式界面。
在下面的例子中,我们定义了一个包含输入、列表和复选框的交互式界面。

import { prompt, Separator, QuestionCollection } from 'inquirer'

export default async (): Promise<void> => {
  const name = process.argv[3]

  if (!name) {
    console.error('Please pass one argument!!')
    process.exit(1)
  }

  const msg = `
    Hello!! ${name} !!!
  `
  console.log(msg)

  // Input
  const inputQuestions: QuestionCollection = [
    {
      type: 'input',
      message: "What's your name",
      name: 'name'
    }
  ]
  await prompt(inputQuestions).then((answers: any) => {
    console.log(JSON.stringify(answers, null, '  '))
  })

  // List
  const listQuestions: QuestionCollection = [
    {
      type: 'list',
      name: 'color',
      message: 'What do you like color?',
      choices: [
        'black',
        'red',
        {
          name: 'orange',
          disabled: 'disabled'
        },
        'green'
      ]
    }
  ]
  await prompt(listQuestions).then((answers: any) => {
    console.log(JSON.stringify(answers, null, '  '))
  })

  // Checkbox
  const checkboxQuestions: QuestionCollection = [
    {
      type: 'checkbox',
      message: 'select',
      name: 'select',
      choices: [
        new Separator(' = Choise A = '),
        { name: 'hoge' },
        { name: 'fuga' },
        { name: 'foo' }
      ],
      validate: (answer: any): boolean | string => {
        if (answer.length < 1) {
          return 'You must choose'
        }

        return true
      }
    }
  ]
  await prompt(checkboxQuestions).then((answers: any) => {
    console.log(JSON.stringify(answers, null, '  '))
  })
}

执行

因为建立项目很麻烦,所以我会用 ts-node 来执行。

$ npx ts-node bin/cli.ts hello test

    Hello!! test !!!

? What's your name is_ryo
{
  "name": "is_ryo"
}
? What do you like color? red
{
  "color": "red"
}
? select hoge, fuga, foo
{
  "select": [
    "hoge",
    "fuga",
    "foo"
  ]
}

最后

我成功地创建了一个简单的交互式CLI。现在我们有了创建CLI的基础,让我们继续制作自己的CLI吧!再见!!!

广告
将在 10 秒后关闭
bannerAds