Commander使用记录

参考文章
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里写的参数混淆,还有顺序问题

猜你喜欢

转载自blog.csdn.net/u011393161/article/details/81134391