commander.js 入门指南:构建强大的命令行界面 (全网最全教程)

Node.js的世界里,创建用户友好的命令行界面(CLI)对于许多应用程序和工具来说至关重要。Commander.js 是一个广受欢迎的 Node.js 包,它为开发者提供了一套简洁而强大的 API,用于快速创建功能完备、用户友好的命令行界面(CLI)应用程序。

一、安装 Commander.js

首先确保您已安装 Node.js 环境。然后,使用 npm(Node Package Manager)轻松安装 Commander.js:

npm install commander

这将在您的项目中添加 commander 依赖项,您可以在项目的 JavaScript 文件中通过 require() 来引入并使用它。

const { program } = require('commander');// 或者通过创建实例的方式const { Command } = require('commander');
const program = new Command();

二、基础用法:定义命令与选项

Commander.js 提供了许多方法来帮助你构建功能丰富的命令行应用。以下是一些常用的方法:

1, 在 Commander.js 中,program 代表整个命令行程序的根节点,通过它您可以定义子命令、选项、参数以及执行动作。

program.command(name[, description])

定义一个新的子命令。name 是子命令的名称,description 是可选的描述。

const subCommand = program.command('sub', 'Sub command description');

program.alias(name)

为命令或子命令设置一个别名。

program.command('list').alias('ls');

program.description(desc)

为命令或子命令设置描述。

program.command('clone').description('Clone a repository');

program.version(version[, flags[, description]])

设置程序的版本信息,并关联一个可选的命令行选项,以便用户查询版本。

// version: (`string`) 程序的版本号。// optionFlags (`string`, *可选*): 指定显示版本信息的命令行选项,如 `-V, --version`。如果不提供,将默认为 `--version`。// description (`string`, *可选*): 版本选项在帮助信息中的描述。
program.version('1.2.3', '-v, --version', 'Output the current version');

program.helpOption(flags[, description])

自定义帮助选项。默认情况下,Commander.js 会添加一个 -h, --help 选项。你可以使用此方法更改帮助选项的名称和描述。

program.helpOption('-i, --info', 'Display help information');

program.option(flags, description, [defaultValue], [fn])

是 Commander.js 中的一个方法,用于定义全局选项,可以定义多个全局选项。。它允许你提供一个短名称、一个长名称、一个描述以及一个可选的处理函数来处理输入的参数值。

// - `flags`:这是一个字符串,包含参数的短名称和长名称。短名称和长名称,中间可以逗号、竖线或空格隔开。例如:`-a, --numberA`。
// - `description`:这是一个字符串,描述了参数的用途。这个描述将在命令行应用的帮助信息中显示。
// - `defaultValue`(可选):这是参数的默认值。如果用户没有提供参数值,将使用此默认值。
// - `fn`(可选):这是一个函数,用于处理输入的参数值。例如,你可以使用 `parseInt` 或 `parseFloat` 函数将输入的字符串转换为数字。如果未提供此函数,参数值将作为字符串处理。program.option("-d, --debug", "是否开启调试模式", false)// -e/--env后跟的字符,将存到envName属性中.option("-e, --envName <envName>", "获取环境变量名称", 'production');

获取选项键值对
使用opts()获取解析命令行参数后的选项键值对,属性名为选项的长标识

const opts = program.opts();
console.log(opts) // => {debug: false, envName: 'production'}

program.parse(process.argv)

// 这行代码是用来解析命令行参数的,它将会读取 process.argv 数组中的参数,并根据定义的命令和选项来执行相应的操作。// 其中,process.argv 是一个包含命令行参数的数组,
// 第一个元素是 Node.js 的可执行文件路径,
// 第二个元素是当前执行的 JavaScript 文件路径,
// 之后的元素是传递给脚本的参数。
process.argv ['/Users/nolan/.nvm/versions/node/v20.12.1/bin/node','/Users/nolan/Desktop/zustand-cli/src/index.js','zustand','new'
]
// program.parse(process.argv) 将会解析这些参数并执行对应的命令。// argv(`string[]`, 默认: `process.argv.slice(2)`): 要解析的命令行参数数组。通常不需要传递,直接使用默认值即可。program.parse(process.argv);

三、实战演练:创建一个简单的文件查找器

创建一个简单的命令行应用

我们将创建一个简单的命令行应用,用于计算两个数字的和。首先,创建一个名为 addition-cli.js 的文件,并引入 Commander.js:

const { program } = require('commander');

接下来,我们需要定义我们的命令行参数。在这个例子中,我们需要两个数字参数。我们将使用 option 方法来定义这些参数:

program.option('-a, --numberA <value>', 'First number', parseFloat).option('-b, --numberB <value>', 'Second number', parseFloat);

option 方法接受三个参数:

  1. 参数的短名称(如 -a)和长名称(如 --numberA
  2. 参数的描述
  3. 可选的参数处理函数。在这个例子中,我们使用 parseFloat 将输入的字符串转换为浮点数。

现在,我们需要处理这些参数,并执行相应的操作。我们将使用 action 方法来实现这一点:

program.action(() => {const { numberA, numberB } = program.opts();if (numberA === undefined || numberB === undefined) {console.error('Both numbers must be provided');process.exit(1);}const result = numberA + numberB;console.log(`The sum of ${numberA} and ${numberB} is ${result}`);
});

program.opts() 会返回一个包含所有命令行参数的对象。我们从该对象中提取 numberAnumberB,然后计算它们的和,并将结果输出到控制台。

最后,我们需要调用 program.parse() 方法来解析命令行参数:

program.parse(process.argv);

现在,我们的 addition-cli.js 文件应该如下所示:

#!/usr/bin/env nodeconst { program } = require('commander');program.option('-a, --numberA <value>', 'First number', parseFloat).option('-b, --numberB <value>', 'Second number', parseFloat);program.action(() => {const { numberA, numberB } = program.opts();if (numberA === undefined || numberB === undefined) {console.error('Both numbers must be provided');process.exit(1);}const result = numberA + numberB;console.log(`The sum of ${numberA} and ${numberB} is ${result}`);
});program.parse(process.argv);

测试我们的命令行应用

现在,我们可以通过运行以下命令来测试我们的命令行应用:

node addition-cli.js -a 3.2 -b 4.8

输出应该如下所示:

The sum of 3.2 and 4.8 is 8

总结

在本文中,我们学习了如何使用 Commander.js 创建一个简单的命令行应用。我们通过一个实际的例子介绍了如何定义和处理命令行参数。当然,Commander.js 还有许多其他功能,如子命令、自定义帮助信息等,你可以在 Commander.js 官方文档 中找到更多信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用TCC方案轻松实现分布式事务一致性

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,一个热爱技术的活力小青年,今天要和大家分享的是一种在分布式系统中实现事务的一种经典方案——TCC(Try Confirm Canc…

【Ubuntu】超详细安装Ubuntu系统

鉴于有些小伙伴在安装Ubuntu系统的时候遇到很多问题&#xff0c;因此打算编写一篇记录一下安装Ubuntu系统的整个过程~互相学习&#xff01; 一、制作U盘启动 准备一个大于8G以上的U盘&#xff0c;这里我使用的是16G的U盘下载UltraISO工具 网站地址&#xff1a;UltraISO准备Ub…

C++ Primer 第五版 第15章 面向对象程序设计

面向对象程序设计基于三个基本概念&#xff1a;数据抽象、继承和动态绑定。 继承和动态绑定对编写程序有两方面的影响&#xff1a;一是我们可以更容易地定义与其他类相似但不完全相同的新类&#xff1b;二是在使用这些彼此相似的类编写程序时&#xff0c;我们可以在一定程度上…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

Stable diffusion prompts 使用语法、参数讲解、插件安装教程

Stable diffusion prompts 使用语法、参数讲解、插件安装教程 本文基于 Stable diffusion WebUI 进行讲解&#xff08;安装在 AutoDL 上&#xff0c;安装在本地电脑上的也同样适用本教程&#xff09;。 初始界面&#xff1a; 文件目录结构&#xff1a; 上图红框中的 4 个文件…

requests模块编写漏洞检测工具

#尝试使用python登录pikachu爆破模块 #发送post数据包&#xff0c;包含用户名密码&#xff0c;对接受到的响应进行判断&#xff0c;如何为登录成功 #爆破密码 with open(passwor.txt,r) as f: passwordf.readlines() for i in password: data {username: admin, password: i, …

数据结构——算法和算法效率的度量

目录 一、引言 二、算法 1 算法的基本概念 2 算法的复杂度 2.1 时间复杂度 2.1.1 概念 2.1.2 大O的渐进表示 3 算法的空间复杂度 3.1 概念 3.2 实例 4 实例分析 5 结论 一、引言 大家在写代码的时候有没有发现写同样功能的代码有多种不同的写法&#xff0c;而不同的代…

51种企业应用架构模式详解

01 什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈及的模式也都是关于企业应用的。&#xff08;企业应用还有一些其他的说法&#xff0c;如“信息系统”或更早期的“数据处理”。&#xff09;那么&#xff0c;这里的“企业应用”具体指的是什…

[原型资源分享]经典产品饿了么UI模版部件库

​部件库预览链接&#xff1a;https://f13gm0.axshare.com 支持版本: Axrure RP 8 文件大小: 3MB 文档内容介绍 基本部件&#xff1a;表单样式&#xff1a;12款、数据样式&#xff1a;10款、服务样式&#xff1a;6款、导航&#xff1a;5款、业务组件&#xff1a;7款、 模板…

python把简体中文转换为繁体中文

Python 可以使用第三方库来将简体中文&#xff08;简体中文&#xff09;转换为繁体中文&#xff08;繁体中文&#xff09;。一个常用的库是 opencc-python-reimplemented&#xff0c;它是 Open Chinese Convert (OpenCC) 的 Python 实现&#xff0c;OpenCC 是一个开源的中文简繁…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

Python魔法之旅-魔法方法(14)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

在Debian系统上赋予普通用户ping 权限

在Debian系统上&#xff0c;普通用户默认情况下没有权限使用 ping 命令&#xff0c;因为它需要发送 ICMP 包&#xff0c;这通常需要 root 权限。为了允许普通用户使用 ping&#xff0c;可以设置 ping 命令的 setuid 位。以下是具体的步骤&#xff1a; 查找 ping 命令的位置&am…

2024年度自贡市社会民生重大科技计划项目申报要求、时间流程

一、申报要求 申报项目需符合以下申报要求和申报指南要求&#xff0c;申报资料需在“自贡市科技综合业务服务平台”中的“自贡市重点科技计划项目管理系统”上传。 &#xff08;一&#xff09;项目申报单位要求。 1.项目申报单位包括项目牵头单位和项目合作单位。 2.多家单…

【Python】pyinstaller打包时添加详细信息

在要被打包的py文件同级目录新建version.txt&#xff0c;写入以下内容 # UTF-8 # # For more details about fixed file info ffi see: # http://msdn.microsoft.com/en-us/library/aa381058.aspx # VSVersionInfo(ffiFixedFileInfo(filevers(1, 4, 0, 5),prodvers(1, 4, 0, 5…

SpringBoot使用RabbitMQ实现延迟队列

SpringBoot使用RabbitMQ实现延迟队列 需求和目标名词解释实现方式引入依赖添加配置文件配置类死信队列消费者即时队列消费者延迟消息发送结果注意 需求和目标 商城系统&#xff0c;用户下单后若15分钟内仍未完成支付&#xff0c;则自动取消订单&#xff0c;若已支付&#xff0c…

重组蛋白的定量定性方法,你了解吗?

重组蛋白的定量和定性分析是蛋白质工程和生物技术中至关重要的步骤&#xff0c;用于确保蛋白质的表达、纯度和功能性符合预期。以下是小编整理的一些常用的方法以及实验介绍&#xff0c;希望这些方法帮助研究人员详细了解重组蛋白的特性。 主要的定性方法 1 WB&#xff08;Wes…

AIGC 011-SAM第一个图像分割大模型-分割一切!

AIGC 011-SAM第一个图像分割大模型-分割一切&#xff01; 文章目录 0 论文工作1论文方法2 效果 0 论文工作 这篇论文介绍了 Segment Anything (SA) 项目&#xff0c;这是一个全新的图像分割任务、模型和数据集。SA 项目是一个具有里程碑意义的工作&#xff0c;它为图像分割领域…

基于springboot的多媒体素材库源码数据库

基于springboot的多媒体素材库源码数据库 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定多媒体素材库…

迎七一党史知识竞赛答题怎么做

迎七一党史知识竞赛答题&#xff0c;不仅是对于党史知识的检验&#xff0c;更是对于参赛者学习态度和综合能力的考量。在参与这类竞赛时&#xff0c;我们需要做好充分的准备&#xff0c;掌握一定的答题技巧&#xff0c;才能取得好的成绩。 首先&#xff0c;我们要深入了解竞赛…