参考文章
https://github.com/tj/commander.js
http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
之前没怎么写过node,所以git上面的readme看起来有点吃力,找了几篇文章来看才摸到点门道,但是还有不少问题
1.怎么运行
第一步肯定是创建工程,安装commander,然后复制一下git地址里readme上面的第一个例子,这个时候发现只能通过node命令来执行这个文件,或者chmod,但是都不像是命令行的感觉,其实可以在package.json里加上这个
"bin": {
"f": "index.js"
}
然后在工程路径下执行npm link,就可以通过敲一个f来执行index.js了,npm link简单的说就是把工作目录给链接到全局了,可以运行了以后就自己试试各种例子吧,我开始看的时候感觉很不耐烦,觉得这么一个只是处理命令行的工具,为啥要这么复杂,这么难用,其实是自己太急于求成了,也和最近业务多时间少有关系,总之耐下心来吧
2.踩的一些坑
action是异步执行的,所以写成下面这样的话,
let cmdValue,envValue
program
.command('add')
.arguments('<cmd> [env]')
.option('-r, --recursive', 'Remove recursively')
.action(function (cmd, env) {
cmdValue = cmd;
envValue = env;
if (typeof cmdValue === 'undefined') {
console.error('no command given!');
process.exit(1);
}
});
console.log('command:', cmdValue);
console.log('environment:', envValue || "no environment given");
如果敲一个f add test all会输出
command: undefined
environment: no environment given
所以相关处理最好都在action函数里做
option函数可以添加一些可选项,选项是会被校验的,如果写了一个没有的选项,就会报错
-h会列出定义的子命令,如果敲f -h会输出
Usage: f [options] [command]
Options:
-h, --help output usage information
Commands:
add [options] <cmd> [env]
如果再敲f add -h会输出
Usage: add [options] <cmd> [env]
Options:
-r, --recursive Remove recursively
-h, --help output usage information
个人感觉,command、option、description、action四个函数就可以满足大部分的需要了,arguments函数容易和command里写的参数混淆,还有顺序问题