本篇博客主要介绍了如何使用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 nodeconst 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 hereconsole.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]} ?` + chalk`{default.bold Clone project into local path...}`);

4. 最后

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

Happy hacking.

转载于:https://www.cnblogs.com/detectiveHLH/p/10881963.html

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

  1. antd 3升级命令_是时候拥有一个你自己的命令行工具了

    本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始,创建属于自己的命令行工具. 0. 一分钟体验 首先我们先花一分钟的时间,体验一下创建自己的命令行cli工具是什么 ...

  2. Ledger-复式记账的一个功能强大的命令行工具

    无论你是一个电脑极客还是普通用户,记录账户开销总是必不可少的.虽然在Linux上有很多基于GUI的记账工具(比如 - GNUCash)受到大家欢迎,但是工作在命令行的记账工具是很多用户难以想象的.在本 ...

  3. 基于Fluent Terminal和Cmder打造一个美观的Windows命令行工具

    前言   相信有很多小伙伴跟我一样,觉得Windows的原生命令行工具具有很多缺点:传统的黑底白字(Windows PowerShell则是蓝底白字)极不美观,复制文本不方便,不支持多Tab页导致多窗 ...

  4. 懒人神器 !一个创意十足的 Python 命令行工具

    作者 | 写代码的明哥 来源 | Python编程时光 当听到某些人说 xx 库非常好用的时候,我们总是忍不住想要去亲自试试. 有一些库,之所以好用,是对一些库做了更高级的封闭,你装了这个库,就会附带 ...

  5. go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具

    使用 MacOS 做开发的朋友都知道,我们一般会使用 Homebrew 做软件包管理,经常会用到 brew install [soft] 来安装各种各样的命令行软件.今天通过一个百科查找的命令行工具( ...

  6. 如何手动写一个命令行工具?

    文章目录 前言 一.一个最简单的命令行工具 二.命令行解析工具 1.commander (1)option (2)version (3)command (4)argument 2.co-prompt ...

  7. 构建现代化的命令行工具

    文章源于 lambdas.dev 每当我们想要创建一个基于 NodeJS 的命令行工具时,就会衍生出一堆问题需要解决,比如如何准备开发环境,如何打包转译代码,如何使代码在转译后保持可调用的状态同时尽可 ...

  8. 代码同步工具_构建现代化的命令行工具

    每当我们想要创建一个基于 NodeJS 的命令行工具时,就会衍生出一堆问题需要解决,比如如何准备开发环境,如何打包转译代码,如何使代码在转译后保持可调用的状态同时尽可能的压缩体积, 以及怎样设计项目分 ...

  9. 基于sqlcmd命令行工具管理SQL server

    在SQLServer数据库当中,除了大家熟知的基于SSMS来管理SQLserver数据库之外,还有一个很强大的命令行工具sqlcmd.该命令行工具基本等同于Oracle SQL*Plus以及 MySQ ...

  10. deb 安装_本地安装DEB包的3种命令行工具(适合Ubuntu和Deepin )

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 在本教程中,我们将学习如何使用三种不同的命令行工具(d ...

最新文章

  1. python pptp链接_渗透技巧——PPTP口令的获取与爆破
  2. optee的fast call的介绍
  3. Kubernetes 稳定性保障手册 -- 可观测性专题
  4. 装linux时可用空间只有1929k,求Linux命令习题
  5. 我把公司当家,老板当爹,结局...
  6. Activity、BroadcastReceiver、Service共同工作的简单例子
  7. VC6 + OpenCV1.0实现图片缩放显示
  8. Python求解进制问题(阿里巴巴2015笔试题)
  9. Unity3D吐槽2--AnimationEvent
  10. mysql 页大小_查找最佳页面大小
  11. 千万千万别裸辞,否则你已经死了
  12. 慕课网-哒哒租车系统
  13. dos2unix和unix2dos命令
  14. jQuery中常需引用的jquery.min.js文件的内容
  15. linux 搭建Discuz论坛教程-个人实践笔记
  16. 在线压缩pdf文件任意大小,在线压缩pdf文件大小
  17. Win10 忘记开机密码的解决办法(亲测可用)
  18. 大学各专业计算机专属表情包,是不是每个专业都有专属表情包?
  19. 牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(二)
  20. 企业微信开发总结-获取通讯录

热门文章

  1. 缓存踩踏:Facebook史上最严重的宕机事件分析
  2. Nacos 1.3.0 来了,基于全新内核构建!
  3. 为什么 String hashCode 方法选择数字31作为乘子?
  4. 这个“忽悠”马云10亿的男人,还了阿里巴巴5000亿
  5. 说说年度补税退税的问题
  6. 线性代数矩阵思维导图_斌叔2021考研数学公式:几种特殊形式的矩阵
  7. RQNOJ 95 多多看DVD(加强版):01背包
  8. 边工作边刷题:70天一遍leetcode: day 45-1
  9. Js判断当前浏览者的操作系统
  10. ADO BUG之'无法为更新定位行....' 解决之道