Node CLI 之 Commander.js (1)

2023-12-09 10:04
文章标签 js node cli commander

本文主要是介绍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

这篇关于Node CLI 之 Commander.js (1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/473393

相关文章

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件