前言
因为要写一个命令行小工具,不打算弄得太麻烦,只是简单的通过一个命令和几个参数就足够了,为了简单,选择用nodejs来做,只是一个辅助小功能而已。
因为要接受参数,起初只是通过process.argv
获取参数,这个比较简单,按照参数个数逐个获取就可以了,但是使用起来发现有些问,因为这些参数是可以省略的,只需要按照需要传入就可以,这样就会造成参数位置不确定,这就需要更多的处理。
理想的形式是:命令 -a 值 -b 值 -c 值 --par 值
按照这个想法在网上找了一下(这个简单要求应该是有现成的包的),就找到了minimist
。
安装
1
npm install minimist
使用
1
2
3
4
5
6
// 完整参数
// var argv = require('minimist')(process.argv);
//需要的参数
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
1
node index2.js aa bb cc -h --help -a=1 -b 2 --test 123 --dev=456 --arr 123 --arr=456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
_: [
'aa',
'bb',
'cc'
],
h: true,
help: true,
a: 1,
b: 2,
test: 123,
dev: 456,
arr: [ 123, 456 ]
}
通过上面的测试完全满足我的需要,可以看到他只是对process.argv
接收的参数进行解析。解析结果是一个对象:
- 没有中划线的参数以数组的形式在
_
这个key中。 - 中划线的短参数(
-
)或者双中划线的长参数(--
)都是以参数名为key的。设置两次就以数组形式存在 - 其实他没有长参数和短参数的区别,只是简单分开
- 如果参数后面没有值,则表示是
boolean
类型
参数类型
开发的时候还是发现有些小问题,主要是参数的类型,经查看代码发现它有第二个参数,而这个参数恰恰是用来约束参数类型的。
1
2
3
4
5
6
7
const options = {
string: ["dir", "d", "word", "w", "to", "t"],
number: ["resize", "r"],
boolean: ["help", "h"],
}
const argv = require('minimist')(process.argv.slice(2), options);
通过上面的参数类型约束,可以更好的处理参数。
注:我需要这个参数约束的原因是因为上面的
dir
参数,这是一个目录,但是我的目录名是包括001
这样的目录,总被转化为数字,导致找不到对应目录。
别名
再仔细研究一下发现,minimist
也有别名功能,设置也很简单
1
2
3
4
5
6
7
8
9
10
const options = {
string: ["dir", "d", "word", "w", "to", "t"],
boolean: ["help", "h"],
alias:{ "dir":"d","word":"w","to":"t" ,"help":"h"}
}
var argv = require('minimist')(process.argv,options);
console.dir(argv);
1
node index3.js -w a --word aaa -d b --dir bbbb -h --help -t c --to cccc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
_: [
'/usr/local/bin/node',
'/Users/mmy83/workspace/node/cmd/index3.js'
],
help: true,
h: true,
w: [ 'a', 'aaa' ],
word: [ 'a', 'aaa' ],
d: [ 'b', 'bbbb' ],
dir: [ 'b', 'bbbb' ],
t: [ 'c', 'cccc' ],
to: [ 'c', 'cccc' ]
}
会发现设置了别名后,参数的数值是关联的,不再是没有任何关系而独立解析的。