下面是一个使用commander在nodejs中添加命令的简单示例:
'use strict';
const {Command} = require('commander');
const run = () => {
const program = new Command();
console.log('CMD');
program.command('cmd [opts...]')
.action((opts) => {
console.log('OPTS');
});
program.parse(process.argv);
};
run();
在这种情况下,一切正常,但是当我添加描述和选项时,commander
抛出错误:
program.command('cmd [opts...]', 'DESCRIPTION', {isDefault: true})
node test-commander.js cmd opts
test-commander-cmd(1) does not exist, try --help
我的环境:
node v8.9.3
npm 5.3.0
commander 2.12.2
这是指挥官声明的行为。从 git 样式子命令下的 npm 页面...
当使用描述参数调用 .command() 时,不应调用 .action(callback) 来处理子命令,否则会出现错误。这告诉 commander 你将对子命令使用单独的可执行文件,就像 git(1) 和其他流行的工具一样。 指挥官将尝试使用名称 program-command(如 ./examples/pm)搜索入口脚本目录中的可执行文件,例如 pm-install、pm-search。
因此,当您添加类似的描述时,它会假设您有另一个名为test-commander-cmd
的可执行文件用于 sub 命令。
如果指挥官的行为不是你所期望的,我可能会建议你看看我发布的一个包,叫做 wily-cli...当然,只有当你不致力于指挥官时,;)
假设您的代码位于file.js
中,您使用 wily-cli 的示例将如下所示......
const cli = require('wily-cli');
const run = () => {
cli
.command('cmd [opts...]', 'DESCRIPTION', (options, parameters) => { console.log(parameters.opts); })
.defaultCommand('cmd');
};
run();
// "node file.js option1 option2" will output "[ 'option1', 'option2' ]"
当我登陆这个遇到相同问题的古老线程时,给出我的答案可能对其他将登陆这里进行搜索的人有用。 您应该添加描述,而不是command
调用,而是单独调用
command.description('Description Text');
在这种情况下,指挥官的行为是不同的,它不会忽略命令设置的action
调用。
const group = program.command('group');
group.command('add <item>`).description('Add something to group`).action(() => {
//do something
});
group.command('remove <item>`).description('Remove something from group`).action(() => {
//do something
});