您可以使用commander.js重用其他命令中定义的选项吗?

时间:2017-12-22 02:15:58

标签: node.js command-line-interface

所以我有几个命令,它们都使用相同的选项。

例如......

program.command('hello')
    .option('--foo <name>', 'this is the foo option and requires a name')
    .option('--bar', 'this is the bar option and takes no arguments')
    .action(options => {
        // do stuff here...
    });

program.command('world')
    .option('--foo <name>', 'this is the foo option and requires a name')
    .option('--bar', 'this is the bar option and takes no arguments')
    .action(options => {
        // do stuff here...
    });

我想重构一下并定义一次选项。但是,对每个命令采取的操作可能不同。

有没有办法声明一次选项并将它们用于定义的任何/所有命令?

2 个答案:

答案 0 :(得分:1)

您可以构建您的共享命令,然后您可以向其中添加特定配置。

初始化您的共享项目:

const createCommandWithSharedOptions = () => new program.Command()
    .option('--foo <name>', 'this is the foo option and requires a name')
    .option('--bar', 'this is the bar option and takes no arguments')

根据共享的 init 定义您的自定义命令:

const hello = createCommandWithSharedOptions().name('hello').arguments('<req> [opt]')
const world = createCommandWithSharedOptions().name('world')

将它们添加到 program

program.addCommand(hello).addCommand(world)

答案 1 :(得分:0)

我提出的解决方案仅适用于具有相同选项的命令。要使用独特的选项,您可能必须扩展我找到的解决方案,或者也许还有其他方法。

我想出了什么:

[
    {
        name: 'hello',
        method: 'hiMethod'
    },
    {
        name: 'world',
        method: 'woMethod',
    },
].forEach(cmd => {
    program.command(cmd.name)
        .option('--foo <name>', 'this is the foo option and requires a name')
        .option('--bar', 'this is the bar option and takes no arguments')
        .action(options => {
            // do stuff here...
            // I can use `cmd.method` for unique actions for each command
        });
});

此解决方案对我有用:)