是时候拥有一个你本身的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,建立属于本身的命令行工具。javascript

0. 一分钟体验

首先咱们先花一分钟的时间,体验一下建立本身的命令行cli工具是什么感受。html

0.1. 新建项目目录

假如咱们的项目名称叫hello-cli,使用以下命令新建项目目录。java

mkdir hello-cli && cd hello-cli
复制代码

0.2. 初始化项目

接下里使用npm-init命令来初始化一个简单的package.json文件。node

npm init -y
复制代码

-y命令表示接受npm的一切默认参数设置。而后替换package.json为以下代码。git

{
  "name": "hello-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
    "hello": "hello"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chalk": "^2.4.2",
    "commander": "^2.20.0",
    "inquirer": "^6.3.1",
    "shelljs": "^0.8.3"
  }
}
复制代码

而后使用npm install安装依赖。github

0.3. 新建入口文件

在项目根目录下新建名为hello的文件,不须要任何后缀,值得注意的是此时的文件名就是你的cli工具第一个键入的命令,例如npm install,那么hello就等价于npm。并将代码替换以下。shell

#! /usr/bin/env node

const program = require('commander');
const inquirer = require('inquirer');
const chalk = require('chalk');

program
  .command('init')
  .alias('i')
  .description('初始化项目')
  .action(option => {
    // 该对象用于存储全部与用户交互的数据
    let config = {
      // 假设咱们须要用户自定义项目名称
      projectName: null
    };
    // 使用chalk打印美化的版本信息
    console.log(chalk.default.bold('hello v1.0.0'));

    // 用于存储全部的交互步骤,例如让用户输入项目名称就是其中一个步骤
    let promps = [];
    if (config.projectName === null) {
      promps.push({
        type: 'input',
        name: 'projectName',
        message: '请输入项目名称',
        validate: input => {
          if (!input) {
            return '项目名称不能为空';
          }
          // 更新对象中属性的数据
          config.projectName = input;
          return true;
        }
      });
    }

    // 至此,与用户的全部交互均已完成,answers是收集到的用户所填的全部数据
    // 同时,这也是你开始操做的地方,这个cli工具的核心代码应该从这个地方开始
    inquirer.prompt(promps).then(async (answers) => {
      // do something here
      console.log(answers);
    });
  });

program.parse(process.argv);
复制代码

0.4. npm link

那么问题来了, 在你的项目根目录下使用npm link,而后在你本地上就至关于安装了名为hello-cli这样的一个全局npm包了。其原理是将你本地的项目在全局的node_modules中作了一个软连接,拿此项目举例,全局的hello命令已经指向了你的本地目录。若是你想取消测试项目在全局中的映射,一样的进入项根目录,输入命令npm unlink便可。npm

而后搭配如下命令食用你的第一个cli工具吧。若是报错提示没有权限,在命令前加上sudo便可。json

hello init
# 或者
# hello i
复制代码

1. commander

commander是一个Node.js环境下的命令行接口解决方案。在上面的一分钟体验例子中,咱们用到了command,alias,description,action这四个API。后端

  • command command表明了这个cli工具向用户暴露的命令行指令。咱们仍是拿npm install来举例子,command('init')声明了一个叫init的命令,在此处,init等价于install

  • alias alias是对于当前命令行指令的更短的指令。例如你们都知道,npm install能够简写为npm ii就是定义的alias

  • description description是对当前命令行指令的描述,commander会自动的生成当前cli工具的帮助文档,而该描述就会在hello -h中展现,若是你的一分钟体验项目还在的话,在命令行中输入hello -h就能够看到自动生成的帮助文档了

  • action action是咱们注册咱们本身回调函数的地方

  • parse parse命令则是解析命令行

下面是一分钟体验项目中没有使用的命令,option。仍是举一个例子。若是有用过hexo的应该熟悉这个命令。

hexo new post $YOUR_POST_NAME
复制代码

没用过也不要紧,这个命令是用于建立一个能够自定义名字的Markdown的文档的。你们可能会发现,上面的命令包含了4个单词,而咱们的例子中只有两个。那是由于一分钟项目中没有使用commander的optionAPI。

若是你想在hello项目中实现同样的命令,那么只须要在program中调用该API便可。.option('-p, --post', 'add post'),而后就能够经过option参数获取到-p后面,用户输入的参数的值。

2. inquirer

你们也发现了,在命令行输入init命令后,咱们须要不停地与命令行进行交互拿到数据,可是在代码里并无怎么体现,这是由于咱们用了inquirer来帮咱们作这些事情。

经过inquirer,咱们能够实现输入框,获取用户的输入数据,还能够实现选择框。举个例子,用过antd-design-pro应该熟悉建立项目的流程。在命令行中输入命令yarn create umi,在以后的流程中就会出现一个可选择的list。只须要将步骤中的代码替换成以下便可。

promps.push({
    type: 'list',
    name: 'projectName',
    message: '请输入项目名称',
    choices: [
      {
        name: 'ant-design-pro',
        value: 'ant-design-pro'
      },
      {
        name: 'dva',
        value: 'dva'
      }
    ]
});
复制代码

在项目中,还使用了validate来对用户的输入数据进行验证,若是不须要验证的话,直接把validate整个代码删除掉就好。

3. chalk

chalk没有什么好介绍的,官网上的文档已经写的很详细了。给你们列一下项目中使用的例子就好。

// 使用默认的字体颜色,加粗字体
console.log(chalk.default.bold('hello v1.0.0'));
// 打印蓝色的提示信息
console.log(chalk.blue('hello v1.0.0'));
// 字符串模板用法,在同一行中打印不一样样式的信息
console.log(chalk`{white.bold [1/3]} 🔍` + chalk`{default.bold Clone project into local path...}`);
复制代码

4. 最后

若是你厌倦了Node.js写后端,想用Java的Spring Boot来写,可是又担忧环境的搭建浪费太多时间。那么你能够试试venus-init,只须要一行命令即可以快速搭建Java的开发环境。

Happy hacking.

相关文章
相关标签/搜索