Без параметров с помощью commander.js

В настоящее время я смотрю commander.js, так как я хочу реализовать CLI с помощью Node.js.

Использование названных параметров легко, так как пример программы "pizza" показывает:

program
  .version('0.0.1')
  .option('-p, --peppers', 'Add peppers')
  .option('-P, --pineapple', 'Add pineapple')
  .option('-b, --bbq', 'Add bbq sauce')
  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
  .parse(process.argv);

Теперь, например, я могу вызвать программу, используя:

$ app -p -b

Но как насчет неназванного параметра? Что, если я хочу называть его с помощью

$ app italian -p -b

? Я думаю, что это не так уж необычно, поэтому предоставление файлов для команды cp не требует использования именованных параметров. Это просто

$ cp source target

и не:

$ cp -s source -t target

Как достичь этого с помощью commander.js?

И как мне сообщить commander.js, что требуемые параметры не требуются? Например, если вы посмотрите на команду cp, укажите источник и цель.

Ответ 1

Старый вопрос, но так как он еще не ответил...

С настоящей версией командира можно использовать позиционные аргументы. Подробнее см. В docs в синтаксисе аргументов, но с помощью вашего примера cp это будет примерно так:

program
.version('0.0.1')
.arguments('<source> <target>')
.action(function(source, target) {
    // do something with source and target
})
.parse(process.argv);

Эта программа будет жаловаться, если оба аргумента отсутствуют, и дать соответствующее предупреждающее сообщение.

Ответ 2

Вы получаете все неназванные параметры через program.args. Добавьте в свой пример следующую строку

console.log(' args: %j', program.args);

Когда вы запустите приложение с помощью -p -b -c gouda arg1 arg2, вы получите

you ordered a pizza with:
- peppers
- bbq
- gouda cheese
args: ["arg1","arg2"]

Тогда вы могли бы написать что-то вроде

copy args[0] to args[1] // just to give an idea