用 Node.js 写个命令行工具

知识储备

简单介绍下本文使用到的几个第三方库

commander

常用的命令行解决方案,用于处理终端命令行中输入的命令及编写命令行指令
就是用来定义你的脚手架里有哪些命令 🗒 详细使用说明

inquirer

可交互的命令行界面工具 ✔️ 详细使用说明

ora

加载过程中的 loading 动画效果,避免枯燥的等待 🕗 详细使用说明

chalk

给终端字体添加颜色,区分不同状态
立马拥有多彩的人生 🌈 详细使用说明

举个例子

创建项目

首先创建个新项目,输入你的 个人 项目信息

mkdir [your-project]
cd [your-project]

yarn init

把上面说的几个工具都给安排上(PS. ora 和 chalk 最新版不支持 CommonJS 了,所以指定了低版本)

yarn add ora@^5 chalk@^4 commander inquirer

定义命令

在根目录创建 index.js , 写一点小命令

const ora = require('ora')
const chalk = require('chalk')
const inquirer = require('inquirer')
const program = require('commander')
const spinner = ora()

// 设置版本号
program.version(require('./package').version, '-v', '版本号')

// 添加命令
program
  .command('time')
  .description('现在时间')
  .action(() => {
    console.log(chalk.cyan(new Date().toLocaleString()))
  })

program
  .command('ask')
  .description('询问楼上 322 住的是不是马冬梅')
  .action(() => {
    inquirer
      .prompt([
        {
          type: 'list',
          message: '🤔 问谁呢?',
          name: 'who',
          default: '楼下大爷',
          choices: ['楼下大爷', '路过的小朋友']
        }
      ])
      .then((answer) => {
        spinner.succeed('楼上 322 住的是马冬梅家吗?')
        spinner.start('😳 思考中...')
        setTimeout(() => {
          spinner.fail('马什么梅?')
        }, 2000)
      })
  })

// 重写默认的帮助选型、名字、描述
program.helpOption('-h, --help', '帮助').addHelpCommand('help [command]', '命令详情')

program.parse(process.argv)

运行看看

运行效果

配置执行文件

作为一个命令行工具,你用 node index.js 运行,这和裸奔有什么区别?
so 咱们给它配置执行文件 bin

在项目目录下创建 bin 文件夹,把 index.js 扔进去

改一下 package.json,添加 bin 说明

{
  "name": "quan-cli",
  "version": "1.0.0",
  "description": "my cli",
  "main": "index.js",
  "repository": "https://github.com/wendygaoyuan/quan-cli.git",
  "author": "Wendy Gao <wendygaoyuan@163.com>",
  "license": "MIT",
  "private": false,
  "bin": {
    "quan-cli": "./bin/index.js"
  },
  "dependencies": {
    "chalk": "^4",
    "commander": "^9.1.0",
    "inquirer": "^8.2.2",
    "ora": "^5"
  }
}

最后不要忘了把 index.js 里的版本号获取目录从 ./ 改成 ../

// 设置版本号
program.version(require('../package').version, '-v', '版本号')

nice ~ , 咱们在本地调试一下,在项目根目录运行

sudo npm link

完美
最后的最后,不要忘记发布到 npm 中,同步给小伙伴们一起使用 ~

参考

目录