资讯专栏INFORMATION COLUMN

是时候拥有一个你自己的命令行工具了

int64 / 3294人阅读

摘要:本篇博客主要介绍了如何使用以及从零开始,创建属于自己的命令行工具。一分钟体验首先我们先花一分钟的时间,体验一下创建自己的命令行工具是什么感觉。或者是一个环境下的命令行接口解决方案。代表了这个工具向用户暴露的命令行指令。

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

0. 一分钟体验

首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么感觉。

0.1. 新建项目目录

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

mkdir hello-cli && cd hello-cli
0.2. 初始化项目

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

npm init -y

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

{
  "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安装依赖。

0.3. 新建入口文件

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

#! /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即可。

然后搭配以下命令食用你的第一个cli工具吧。如果报错提示没有权限,在命令前加上sudo即可。

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]}            
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109595.html

相关文章

  • 解RoboMaster视觉组(三)视觉组使用软件

    摘要:视觉组接触的软件进行视觉开发会用到各种各样的软件开发环境辅助工具等,所以很有必要了解一些相关的快捷键命令使用技巧。没有这样保姆级的,并不存在一款能够自动为你生成的软件。一款录制屏幕的软件。 --NeoZng【neozng1@hnu.edu.cn】 3.视觉组接触的软件 进行视觉开发会用到...

    AlphaWallet 评论0 收藏0
  • 使用 NodeJS 构建现代化命令工具

    摘要:前言这是一篇关于如何使用构建高性能高可读性的现代化命令行工具的博客。对于命令行工具来说,运行时的权限是巨大的,但不要因此弄脏用户的系统。 前言 这是一篇关于如何使用 NodeJS 构建高性能、高可读性的现代化命令行工具的博客。 每当我们想要创建一个基于 NodeJS 的命令行工具时,就会衍生出一堆问题需要解决,比如如何准备开发环境,如何打包转译代码,如何使代码在转译后保持可调用的状态同...

    QLQ 评论0 收藏0
  • Docker实战指南(一):Docker介绍

    摘要:主机名命名空间,不同的内部可以拥有不同的主机名。此外,也是解决跨平台部署的利器。也许看完上述介绍大家还是云里雾里,没关系,既然叫实战指南,那么必然有实战部分,我们从最简单的程序开始。后续我们将介绍,如果利用运行你自己的程序。 原文地址:Docker实战指南(一):Docker介绍 Introduction 我第一次注意到Docker大概是在2014年的时候,当时对Docker的第一印象...

    SKYZACK 评论0 收藏0
  • 从零开始打造个人专属命令工具集——yargs完全指南

    摘要:自阮大神的文章发布以来,有了一些改动,添加有很多有用的功能,特别是这个功能,对打造命令行工具集合非常有用,所以写一个新版本的教程还是有必要的。 前言 使用命令行程序对程序员来说很常见,就算是前端工程师或者开发gui的,也需要使用命令行来编译程序或者打包程序 熟练使用命令行工具能极大的提高开发效率,linux自带的命令行工具都非常的有用,但是这些工具都是按照通用需求开发出来的,如果有一些...

    wanghui 评论0 收藏0
  • 三年后,我们从 Docker 转到 RKT

    摘要:在被纳入后,与之争日趋白热化。一如微软曾经试图通过在中安装来排挤,现在正在尝试将融入到,以此来打击,,和。如同微软确确实实提升了的性能。浏览器突出了微软的优势,所以他们在年内都没有继续开发了。 在 Swarm 被纳入 Docker 1.12后,Swarm 与 K8S 之争日趋白热化。本文作者 Adriaan de Jonge 身为 Xebia CTO ,专精 DevOps 及持续交付,...

    Achilles 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<