Node CLI 之 Commander.js (1)

官网地址: https://github.com/tj/commander.js/blob/f1ae2db8e2da01d6efcbfd59cbf82202f864b0c1/Readme_zh-CN.md

Commander.js是node.js命令行界面的完整解决方案

开始

  • 新建一个node工程
  • 执行 npm install commander
  • package.json中新增代码
  • 添加 #! /usr/bin/env node,用于识别是node命令文件
"bin": {"cli": "./index.js"
}

声明 program 变量

/ CommonJS (.cjs)
const { program } = require('commander');

如果程序较为复杂,用户需要以多种方式来使用 Commander,如单元测试等。创建本地 Command 对象是一种更好的方式:

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

选项 option

使用 .option 实现,举个例子,然后再解释难点

program.option('-d, --debug', 'output extra debugging').option('-s, --small', 'small pizza size').option('-p, --pizza-type <type>', 'flavour of pizza');.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');.option('-d, --drink [item]', 'output extra debugging', function deb (v) {console.log('1---', arguments);return '123'})
  • 第一个参数是选项名称,第二个参数选项描述, 第三个参数是默认值, 第四个为过滤函数,会改改变用户输入的值
  • 每个选项可以定义一个短选项名称(-后面接单个字符)
  • 一个长选项名称(–后面接一个或多个单词),驼峰命名法(camel-case)
  • 短名称和长名称之间可以使用逗号,空格,|分割
  • 有两种最常用的选项
    • 一类是 boolean 型选项,选项无需配置参数,
    • 另一类选项则可以设置参数(使用尖括号声明在该选项后,如–expect )。如果在命令行中不指定具体的选项及参数,则会被定义为undefine
调用方式
serve -p 80
serve -p80
serve --port 80
serve --port=80

项及其选项参数可以用空格分隔,也可以组合成同一个参数。选项参数可以直接跟在短选项之后,也可以在长选项后面加上 = 。

完整例子
program.option('-d, --debug', 'output extra debugging').option('-s, --small', 'small pizza size').option('-p, --pizza-type <type>', 'flavour of pizza');.option('-d, --drink [item]', 'output extra debugging', function deb (v) {console.log('1---', arguments);return '123'})program.parse(process.argv);const options = program.opts();
if (options.debug) console.log(options);
console.log('pizza details:');
if (options.small) console.log('- small pizza size');
if (options.pizzaType) console.log(`- ${options.pizzaType}`);
必填选项

通过 .requiredOption 方法可以设置选项为必填。必填选项要么设有默认值,要么必须在命令行中输入,对应的属性字段在解析时必定会有赋值。该方法其余参数与 .option一致

program.requiredOption('-c, --cheese <type>', 'pizza must have cheese');program.parse();终端中部署入参数,会报错
error: required option '-c, --cheese <type>' not specified
变长参数选项

通过使用 来设置参数为可变长参数

program.option('-n, --number <numbers...>', 'specify numbers').option('-l, --letter [letters...]', 'specify letters');program.parse();console.log('Options: ', program.opts());
console.log('Remaining arguments: ', program.args);
$ collect -n 1 2 3 --letter a b c
Options:  { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] }
Remaining arguments:  []
$ collect --letter=A -n80 operand
Options:  { number: [ '80' ], letter: [ 'A' ] }
Remaining arguments:  [ 'operand' ]
$ collect --letter -n 1 -n 2 3 -- operand
Options:  { number: [ '1', '2', '3' ], letter: true }
Remaining arguments:  [ 'operand' ]
其他选项配置

大多数情况下,选项均可通过.option()方法添加。但对某些不常见的用例,也可以直接构造Option对象,对选项进行更详尽的配置

program.addOption(new Option('-s, --secret').hideHelp()).addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute')).addOption(new Option('-d, --drink <size>', 'drink size').choices(['small', 'medium', 'large'])).addOption(new Option('-p, --port <number>', 'port number').env('PORT')).addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)).addOption(new Option('--disable-server', 'disables the server').conflicts('port')).addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' }));

版本选项

.version 方法可以设置版本,其默认选项为-V和–version,设置了版本后,命令行会输出当前的版本号

program.version('0.0.1');

命令

通过 .command.addCommand 可以配置命令, 有两种实现方式

  • 为命令绑定处理函数
  • 将命令单独写成一个可执行文件

先看例子

// 通过绑定处理函数实现命令(这里的指令描述为放在`.command`中)
// 返回新生成的命令(即该子命令)以供继续配置
program.command('clone <source> [destination]').description('clone a repository into a newly created directory').option('-t, --typeName <typeName>', '基于哪个项目').action((source, destination) => {console.log('clone command called');});// 通过独立的的可执行文件实现命令 (注意这里指令描述是作为`.command`的第二个参数)
// 返回最顶层的命令以供继续添加子命令
program.command('start <service>', 'start named service').command('stop [service]', 'stop named service, or all if no name supplied');// 分别装配命令
// 返回最顶层的命令以供继续添加子命令
program.addCommand(build.makeBuildCommand());
  • .command 的第一个参数为命令名称, 命令参数可以跟在名称后面,也可以用.argument 单独指定, 参数可为必选的(尖括号表示)、可选的(方括号表示)或变长参数(点号表示,如果使用,只能是最后一个参数)
  • option 为命令中的选项 比如 vue create my-project -t vue-template
  • .description 为命令描述
  • .action 为命令触发之后,执行的函数

举个例子:

program.command('rmdir <soure>').description('remove some directory').option('-f, --force', '强制删除').action((source, destination) => {console.log('remove some directory');});
// 调用方式
// Try the following:
//    rmdir ./project
//    rmdir ./project -f
//    rmdir ./project --forceprogram.command('add').argument('<first>', 'integer argument', myParseInt).argument('[second]', 'integer argument', myParseInt, 1000).action((first, second) => {console.log(`${first} + ${second} = ${first + second}`);});
// 调用方式
// Try the following:
//    add 1
//    add 1 2program.argument("<name>").option("-t, --title <honorific>", "title to use before name").option("-d, --debug", "display some debugging").action((name, options, command) => {if (options.debug) {console.error("Called %s with options %o", command.name(), options);}const title = options.title ? `${options.title} ` : "";console.log(`Thank-you ${title}${name}`);});// 调用方式
// Try the following:
//    node thank.js John
//    node thank.js Doe --title Mr
//    node thank.js --debug Doe --title Mr

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

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

相关文章

Linux 详细介绍strace命令

system call(系统调用)是程序向内核请求服务的一种编程方式&#xff0c;strace是一个功能强大的工具&#xff0c;可以跟踪用户进程和 Linux 内核之间的交互。 要了解操作系统如何工作&#xff0c;首先需要了解系统调用如何工作。操作系统的主要功能之一是为用户程序提供了一个…

HJ94 记票统计

题目&#xff1a; HJ94 记票统计 题解&#xff1a; 利用哈希表&#xff0c;投票是按姓名从哈希表中取出对应的票数&#xff0c;如果不在哈希表内证明为无效。 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n Inte…

PyQt6 QTimeEdit时间控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

C++新经典模板与泛型编程:将trait类模板用作模板参数

将trait类模板用作模板参数 template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int;static sumT initValue() {return 0;} };template<> struct SumFixedTraits<int> {using sumT __int64;sta…

Proteus仿真--基于DAC0808设计的直流电机调速器

本文介绍基于DAC0808设计的直流电机调速器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 设置按键A-H按键&#xff0c;每个按键分别对应不同的速度&#xff0c;按下后电机按照设定速度转动 仿真图如下 仿真运行视频 Proteus仿真--基于DAC0808设计的直流电机调…

互联网数据传输原理 |OSI七层网络参考模型

网络模型 OSI 网络参考模型&#xff0c;仅作为参考&#xff0c;也就是说OSI网络实际中并不使用。我们只是把OSI网络模型作为参考&#xff0c;在网络出现问题的时候&#xff0c;可以从一个宏观的整体去分析和解决问题。而且搭建网络的时候也并不一定需要划分为7层 但是当今互联…

【uniapp】小程序中input输入框的placeholder-class不生效解决办法

问题描述 uniapp微信小程序&#xff0c;使用input组件时&#xff0c;想要改变提示词 placeholder 的样式&#xff0c;但是使用placeholder-class 改变不了 如下&#xff1a; <input type"text" placeholder"搜索" placeholder-class"placeholde…

2024最新金三银四软件测试面试题

一直以来大大小小参与过不少面试&#xff0c;遇到过不少坑&#xff0c;但是没来的及好好总结汇总下。现在把之前遇到的问题汇总下&#xff0c;希望以后自己能加深印象。 1、appium 怎么定位toast弹框 appium1.6以后回答需要升级u2进行定位。 2、什么是事务&#xff0c;知道事…

PADS9.5封装库转换为AD库

1、打开PADS Layout&#xff0c;File – Library&#xff0c;选中usr&#xff0c;如下图&#xff1a; 2、封装– 导入&#xff0c;选中你的 .d后缀文件(也就是PADS的封装文件)&#xff0c;打开。 3、元件 – 新建 – PCB封装 - 分配 - 确定。 4、&#xff0c;选择“斜线”…

Laya2.13.3接入第三方库Socket.io

服务端&#xff1a; 1.新建一个文件夹&#xff0c;使用npm.init -y创建node工程 2.在控制台使用以下代码下载Socket.io npm install socket.io 3.创建一个app.js的文件&#xff0c;将以下代码填入 import { Server } from "socket.io"; import { createServer }…

Linux学习笔记3 xshell(lnmp)

xshell能连接虚拟机的前提是真机能够ping通虚拟机网址 装OpenSSL依赖文件 [rootlocalhost nginx-1.12.2]# yum -y install openssl pcre-devel 依赖检测[rootlocalhost nginx-1.12.2]# ./configure [rootlocalhost nginx-1.12.2]# yum -y install zlib [rootlocalhost n…

【腾讯云 HAI域探秘】StableDiffusionWebUI 让我找到了宫崎骏动漫里的夏天

目录 前言一、HAI二、应用场景三、构建 Stable Diffusion 模型1、新建HAI应用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介绍&#xff08;2&#xff09;页面转中文&#xff08;3&#xff09;AI绘图① 正向提示词语② 反向提示词③ “” 、“ AND”、“|” 用法④ 权…

自定义函数参数传递问题

最近&#xff0c;被一个函数调用参数传递的问题困惑了一阵。自己写的解释程序&#xff0c;一直用的好好的。在暗自得意的过程中&#xff0c;突然出现了bug&#xff0c;被泼了一头冷水。当然&#xff0c;bug是在无意中被发现的&#xff0c;确定以后则可以编制专用的代码来揭示它…

重积分的应用@物体对外部质点的引力问题

文章目录 引力(*)分析两质点间的引力公式三重积分计算引力薄片情形计算例 引力(*) 这里讨论的是:空间一物体对于物体外一点 P 0 ( x 0 , y 0 , z 0 ) P_{0}(x_0,y_0,z_0) P0​(x0​,y0​,z0​)处单位质量的质点的引力 分析 仍然使用元素法, 设占有空间有界闭区域 Ω \Omega …

网络协议与 IP 编址

网络协议与 IP 编址 之前大概了解过了网络的一些基础概念&#xff0c;见文章&#xff1a; 网络基础概念。 之前简单了解OSI模型分层&#xff1a; TCP/IP模型OSI模型TCP/IP对等模型应用层应用层表示层应用层会话层主机到主机层传输层传输层因特网层网络层网络层网络接入层数据链…

jsonwebtoken生成token和解析

先上npm地址 jsonwebtoken&#xff1a;jsonwebtoken - npm express-jwt&#xff1a;express-jwt - npmps const express require(express); const jwt require(jsonwebtoken); const { expressjwt: expressJWT} require(express-jwt)const app express();// 设置密钥 co…

爱智EdgerOS之深入解析数据库模块的Redis Client

一、Redis 简介 无论是什么类型的应用&#xff0c;都少不了和数据打交道。尤其是一些复杂的应用场景&#xff0c;都少不了一个高效可靠的数据库。例如日常开发中最常见的 MySQL 等关系型数据库&#xff0c;让数据的存储、检索轻松简单起来&#xff0c;甚至可以轻松地处理百万量…

51单片机c语言烧录软件,51单片机烧写程序的方法

STC89C51是应用广泛的51单片机&#xff0c;很多人都是通过该单片机入门学习的&#xff0c;单片机的学习需要勤动手。单片机需要烧写程序&#xff0c;要用到相关的软件和硬件。下面介绍一下51单片机烧写程序的方法。 1 所用到的硬件工具 51单片机烧写程序需要用到单片机的UART…

C语言数组(下)

我希望各位可以在思考之后去看本期练习&#xff0c;并且在观看之后独立编写一遍&#xff0c;以加深理解&#xff0c;巩固知识点。 练习一&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 我们依旧先上代码 //编写代码&#xff0c;演⽰多个字…

数据库Delete的多种用法

数据库的Delete操作是用来删除数据库中的数据记录的&#xff0c;它是数据库操作中的一种重要操作&#xff0c;能够帮助用户删除不需要的数据&#xff0c;以便保持数据库的整洁和高效。在使用Delete操作时&#xff0c;需要注意确保操作的准确性和安全性&#xff0c;以免误删重要…