commander.js可以用来写命令行工具。
官网地址:Commander.js
执行如下命令进行安装,但前提是有node环境,即能使用npm
命令进行安装:
npm install --save commander
如果是简单使用,Commander提供了一个全局对象:
// 引入commander模块
const { program } = require('commander');
// 设置程序的版本号
program.version('0.0.1');
如果程序比较复杂,那么创建本地的Command
对象更好:
// 引入commander模块
const { Command } = require('commander');
// 创建Command对象
const program = new Command();
// 设置程序的版本号
program.version('0.0.1');
用过命令行的知道rm -r
中的-r
是选项、node --version
中的--version
也是选项。
Commander使用.option()
方法来定义选项,并且可以设置关于选项的简介描述,其语法如下:
/**
* program.option(flags, description)
* 参数说明:
* - flags:指的是选项,可以定义一个短选项(如-a)和一个长选项(如--list),短选项与长选项之间使用逗号或空格或竖线(|)进行分隔。例如-a, --list
* - description:指的是选项的简介描述信息
*/
说明:
option()
方法就是用来定义命令行选项的。-a
这种的情况,即一个短杠-
和一个字符)和一个长选项(长选项就是--list
这种的情况,即两个短杠--
和一个或多个单词组成)。,
)、空格(
)和竖线(|
)。例如:-l, --list
采用逗号分隔;-v| --version
采用竖线分隔;-r --remove
采用空格分隔。--template-engine
选项可通过program.opts().templateEngine
获取。-a -b -p 80
可以合并简写为-ab -p80
,甚至简写为-abp80
的形式。program.option('-p','显示端口号');
,也可以只有长选项如program.option('--port','显示端口号');
。例如:
// 使用逗号进行分隔短选项和长选项
program.option('-l, --list', '显示列表信息');
// 使用竖线进行分隔短选项和长选项
program.option('-v| --version', '显示版本信息');
// 使用空格进行分隔短选项和长选项
program.option('-r --remove', '删除');
// 只有短选项
program.option('-p','显示端口号');
// 只有长选项
program.option('--port','显示端口号');
// 多个单词的长选项
program.option('--template-engine','模板引擎');
该种类型的选项无需配置参数,如node --version
后面就没有参数。例如:test.js
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
// 设置选项,boolean类型的选项,不携带参数
program.option('-l, --list', '显示列表信息');
program.option('-v| --version', '显示版本信息');
// 处理参数
program.parse(process.argv);
// 获取选项
var options = program.opts();
// 如果是`list`选项,则进行处理
if (options.list) {
console.log('list选项');
}
// 如果是`version`选项,则进行处理
if (options.version) {
console.log('version选项');
}
如果想要测试这些选项,可以使用node
命令调用该js文件进行测试。
说明:
node
指的是在node环境下,如果要执行js文件就需要使用node
命令。test.js
指的是当前的js文件,包含了我们刚刚写的代码,也是选项的逻辑处理代码。-l
、--list
、--version
就是我们在代码种设置的选项,而打印的结果就是代码种根据逻辑判断做出的处理。if (options.list)
中的list
就是在option()
方法中设定的长选项名list
,也可以用短选项名。选项后面是可以跟着参数的,如rm -rf hello.txt
中hello.txt
就是参数,表示待删除的文件。需要注意下声明待参数的选项的语法:option('-l, --list
。即参数是包括在尖括号<>
中。例如:test.js
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
// 设置选项,待参数的选项,就是参数,尖括号是必须的
program.option('-l, --list ' , '显示目录中的文件列表信息');
program.option('-r, --remove ' , '删除指定文件');
program.option('-v| --version', '显示版本信息');
// 处理参数
program.parse(process.argv);
// 获取选项
var options = program.opts();
// 如果是`list`选项,则进行处理
if (options.list) {
// options.list就是参数值
console.log('list选项,参数值:' + options.list);
}
// 如果是`remove`选项,则进行处理
if (options.remove) {
console.log('remove选项,参数值:', options.remove);
}
// 如果是`version`选项,则进行处理
if (options.version) {
console.log('version选项');
}
options.list
既可以判断是否有该选项,又是在有该选项的情况下后面附加的参数值。option()
方法中设置了选项附带参数,则必须输入参数,否则会报错。node test.js --remove /root/hello.txt /root/home
。选项是可以设置一个默认值的,基本语法如下:
/**
* program.option(flags, description, defaultValue)
* 参数说明:
* - flags:指的是选项,可以定义一个短选项(如-a)和一个长选项(如--list),短选项与长选项之间使用逗号或空格或竖线(|)进行分隔。例如-a, --list
* - description:指的是选项的简介描述信息
* - defaultValue:指的是设置的该选项的默认值
*/
例如:
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
// 设置选项默认值
program.option('-l, --list ' , '显示目录中的文件列表信息', '/home');
program.option('-v| --version', '显示版本信息');
// 处理参数
program.parse();
// 获取选项
var options = program.opts();
// 如果是`list`选项,则进行处理
if (options.list) {
// options.list就是参数值
console.log('list选项,参数值:' + options.list);
}
// 如果是`version`选项,则进行处理
if (options.version) {
console.log('version选项');
}
options()
方法设置了不同的默认值,也只会使用一个。所谓的可选参数指的是既可以选择输入参数,又可以选择不输入参数。
选项的参数使用方括号声明表示参数是可选参数(如--optional [value]
)。该选项在不带参数时可用作 boolean 选项,在带有参数时则从参数中得到值。例如:
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
// 设置选项的可选参数
program.option('-l, --list [directory]', '显示目录中的文件列表信息');
// 处理参数
program.parse(process.argv);
// 获取选项
var options = program.opts();
// 如果是`list`选项,则进行处理
if (options.list === undefined) {
console.log('没有list选项')
} else if (options.list === true) {
console.log('有list选项,没有参数')
} else {
console.log('有list选项,有参数:' + options.list)
}
undefined
。所谓的必填选项就是输入命令的时候必须携带该选项,否则报错。
通过.requiredOption()
方法可以设置选项为必填。其中.requiredOption()
方法的语法如下:
/**
* program.option(flags, description, [defaultValue])
* 参数说明:
* - flags:指的是选项,可以定义一个短选项(如-a)和一个长选项(如--list),短选项与长选项之间使用逗号或空格或竖线(|)进行分隔。例如-a, --list
* - description:指的是选项的简介描述信息
* - defaultValue:指的是选项默认值
*/
program.requiredOption(flags, description);
program.requiredOption(flags, description, defaultValue);
必填选项要么设有默认值,要么必须在命令行中输入,对应的属性字段在解析时必定会有赋值。该方法其余参数与.option()
一致。例如:
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
program.option('-l, --list', '显示文件列表信息');
// 设置必填选项
program.requiredOption('-s, --select', '选择文件');
// 处理参数
program.parse(process.argv);
// 获取选项
var options = program.opts();
// 如果是`list`选项,则进行处理
if (options.list) {
console.log('list选项')
}
// 如果是`select`选项,则进行处理
if (options.select) {
console.log('select选项')
}
node test.js
没有写必填选项报错了;node test.js --list
使用了非必须选项但没有设置必填选项仍然报错了。所谓的变长参数,即当你不确定参数的数量,可能是一个、三个或五个时,就使用变长参数。
定义选项时,可以通过使用...
来设置参数为可变长参数。
在命令行中,用户可以输入多个参数,解析后会以数组形式存储在对应属性字段中。在输入下一个选项前(-
或--
开头),用户输入的指令均会被视作变长参数。与普通参数一样的是,可以通过--
标记当前命令的结束。基本语法如下:
// 普通参数中的变长参数
program.option('-l, --list ' , 'description text')
// 可选参数中的变长参数
program.option('-l, --list [directory...]', 'description text')
例如:
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1');
program.option('-l, --list ' , '显示指定目录下文件列表信息');
program.option('-r, --remove [file...]', '删除指定文件');
// 处理参数
program.parse();
// 获取选项
console.log(program.opts());
// 获取选项后面的参数
console.log(program.args)
版本选项就是设置版本号,是通过.version()
方法来进行设置,其默认选项为-V
和--version
。设置了版本后,命令行会输出当前的版本号。语法如下:
/**
* program.version(str[,flags,description])
* 参数:
* - str:版本号字符串
* - flags:选项名称,默认是-V和--version
* -description:该选项的描述性信息
*/
// 只指定版本号,是一个字符串
program.version(str);
// 还支持自定义选项名称,选项的描述信息
program.version(str, flags, description);
例如:
// 引入commander模块
var {program} = require('commander');
program.version('0.0.1', '-v, --ver', '版本信息');
// 选项处理
program.parse();
大多数情况下,选项均可通过.option()
方法添加。但对某些不常见的用例,也可以直接构造Option
对象,对选项进行更详尽的配置。例如:
// 引入commander模块
const {Command, Option} = require('commander');
const program = new Command();
program.version('0.0.1', '-v, --ver', '版本信息');
program
// 隐藏帮助信息
.addOption(new Option('-s, --secret').hideHelp())
// 通过default()方法设置默认值
.addOption(new Option('-t, --timeout ' , 'timeout in seconds').default(60, 'one minute'))
// 通过choices()方法设置参数值只能选择设定的值
.addOption(new Option('-d, --drink ' , 'drink size').choices(['small', 'medium', 'large']));
program.parse();
// 选项处理
// 忽略...
注意:
Option
对象,需要引入const {Command, Option} = require('commander');
。如面对选项参数复杂的情况,可以通过自定义函数来进行处理。基本语法如下:
/**
* program.option(flags, description, fn, defaultValue);
* 参数:
* - flags:指的是选项信息
* - description:选项的描述信息
* - fn:参数的处理函数,该函数接收两个参数:
* - value:用户新输入的值
* - previous:当前已有的参数值(即上一次调用自定义处理函数后的返回值)
* - defaultValue:选项的默认值
* 返回值:
* - 返回新的选项参数值
*/
program.option(flags, description, fn, defaultValue);
自定义函数适用场景包括参数类型转换,参数暂存,或者其他自定义处理的场景。
例如,将输入的绝对路径转换成文件名:
// 引入commander模块
const {Command, Option} = require('commander');
const program = new Command();
program.version('0.0.1', '-v, --ver', '版本信息');
// 处理list选项参数的函数
var listFn = function (value, previous) {
// 输入的文件列表是使用逗号进行分隔的字符串,把它切割成数组,获取它们的文件名
var list = value.split(',');
list = list.map(item => {
// 由文件的绝对路径获取文件的文件名
return item.substring(item.lastIndexOf('/') + 1);
});
return list;
};
program.option('-l, --list ' , '输入文件列表,使用逗号进行分隔', listFn, '/a.txt,/root/b.jpg,/home/hello.log')
program.parse();
// 选项处理
if (program.opts().list) {
console.log('list选项,参数值:' + program.opts().list);
}
利用 commander.js
写了一个简单的回收站程序: linux-trash-nodejs