命令行参数处理
最后更新于:2022-04-02 06:52:49
## 命令行参数处理
在使用其他命令行程序的过程中(如`npm`),我们经常会使用`--help`命令来查询参数的用法,在输入错误的参数时,还会有提示信息。这些,都是我们在开发自己命令中需要考虑的。我们可以使用`process.argv`属性来获取用户从命令行输入的参数,然后,再自己处理各个参数。聪明如你,一定会想到这么普遍的用法肯定有第三方的模块可以简化处理过程。而这就是我们本章要介绍的模块——[commander](https://www.npmjs.com/package/commander)
[TOC]
### 安装
全局安装
~~~
$ npm install commander -g
~~~
本地安装
~~~
$ npm install commander --save
~~~
### commander的使用说明
`commander`的使用官网提供了几个常用的例子,不过,官网写得比较简洁,不适合新手阅读。这里,我将在例子上加上必要的注释,为了简洁,前面的例子已经注释说明的,后面的例子就不再赘述。
#### 参数解析(parse方法的使用)
下面这个例子的关注点放在`commander`的解析流程上,`commander`的使用流程如下:
1.使用`option()`方法自定义参数;
2.使用`parse()`方法解析用户从命令行输入的参数。
~~~
//index.js
//引用commander模块,这里返回的是一个commander对象
var program = require('commander');
program
.version('0.0.1')//定义版本号
.option('-p, --peppers', 'Add peppers')//参数定义
.option('-P, --pineapple', 'Add pineapple')
.option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);//解析命令行参数,参数定义完成后才能调用
console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);
~~~
`parse()`方法先对`option()`方法定义的参数进行赋值,然后将剩下的参数(未定义的参数)赋值给`commander`对象的`args`属性(`program.args`),`program.args`是一个数组。
>Tips:
链式写法
由于`version(),option()`方法的返回值还是`Commander对象`,所以,可以采用链式写法,即可以用"."来连接各个方法,就是上面例子的写法`program.version(...).option(...)`
在命令行运行上面的例子:
~~~
$ node index -p
~~~
打印结果为
~~~
$ you ordered a pizza with:
- peppers
- marble cheese
~~~
你在命令行运行 `node index --peppers`也会打印出相同的结果。
>Tips :
这里的`index`等价于`index.js`,例子存放文件的路径,只是把.js后缀省略了
>Note:
短标志可以作为单独的参数传递。像` -abc `等于` -a -b -c`。多词组成的选项,像“`--template-engine`”会变成` program.templateEngine` 等。
#### 强制多态(option()方法的使用)
**`option()`方法的定义**
* option(flags, description, fn, defaultValue)
* `flags ` : 自定义参数,格式为`"-shortFlag, --longFlag null||[value]|.."`
* -shortFlag:”-“后面跟的是自定义参数的短标志,一般用longFlag的第一个字母(区分大小写)
* --longFlag :“--”后面跟的是自定义参数的长标志,shortFlag和longFlag必须同时存在,
* `null||[value]`:有3种情况
* `null`——不用输入这一部分的内容,即只写前面两部分,这里为了说明,才写的null,该自定义参数将在程序中被解析为布尔值`(true|false)`
* ``——“<>”修饰,用户在使用-shortFlag(或--longFlag)时,强制后面带一个值,如果不输入该值,命令行程序会中断。该自定义参数将在程序中被解析为字符串(String)
* `[value]`——”[]“修饰,用户在使用-shortFlag(或--longFlag)时,允许后面带一个值,用户不输入使用默认值或undefined。
* `description ` : 对flags参数的描述
* `fn ` : 自定义处理参数的方法,如果传入的不是一个方法,会先判断是否为一个正则表达式,如果不是,则视为defaultValue(默认值),
* `defaultValue ` :自定义参数默认值
* `返回值
';