1

这是一个使用命令在 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
4

1 回答 1

0

那是指挥官的公开行为。从Git-style 子命令下的 npm 页面...

当使用描述参数调用 .command() 时,不应调用 .action(callback) 来处理子命令,否则会出错。这告诉指挥官你将为子命令使用单独的可执行文件,就像 git(1) 和其他流行工具一样。指挥官将尝试在入口脚本目录(如 ./examples/pm)中搜索名称为 program-command 的可执行文件,如 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' ]"
于 2018-03-07T23:38:51.833 回答