commander.js 是解析命令行参数的 nodejs 库,相比同类的 optimist 支持子命令,从而可以很方便得实现 git add 等类似 git 的子命令(kissy 也计划实现类似功能),但是使用中遇到不少问题,commander 本身更新也不频繁,积累了很多 issue,特别是不支持 windows 以及 required 选项无效问题。
incompatible with windows
issue 参见 #142,在 linux/unix 下可以在脚本文件头指定解释器从而可以通过脚本名来直接执行该脚本,例如 x.js
#!/usr/bin/env node console.log(1);
在 *nix 可以直接通过 ./x.js 来运行,而 windows 即必须 node ./x.js 来运行。
commander 在执行子命令时,会直接新起一个一个进程来执行对应的子命令 js,例如 a.js 的子命令 b:
#!/usr/bin/env node child_process.spawn('a-b.js');
但是这样就明显不能在 windows 下运行了,(还有window下会拼成 a.js-b.js 的子命令脚本…).需要改成
#!/usr/bin/env node child_process.spawn('node',['a-b.js']);
具体 fix 详见:fix incompatible with windows
invalid required option
issue 参见 #44, commander 中支持
-p, --path <path>
来表明 path 是必选,但这个必选在 commander.js 中是很奇怪的含义:
node x.js --path // 不通过 node x.js 通过
commander.js 只对用户提供的 option 进行检查,而不提供的 option 直接略过,似乎不是正确的做法,上述 issue 也有人提供兼容的新的标志,我认为还是直接修改为不兼容为好,详见: fix invalid required option