我目前正在研究commander.js,因为我希望使用Node.js实现CLI。
使用命名参数很容易,如“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
命令,source和target是必需的。
3条答案
按热度按时间2izufjch1#
在当前版本的commander中,可以使用位置参数。有关参数语法的详细信息,请参阅文档,但使用您的
cp
示例,它将类似于:如果两个参数都不存在,这个程序将发出警告,并给予相应的警告消息。
r6vfmomb2#
通过
program.args
获取所有未命名参数。当您使用
-p -b -c gouda arg1 arg2
运行应用程序时,您将获得然后你可以这样写
qgzx9mmu3#
program.argument('<myarg>')
+program.namedArgs
(从9.4.1版开始)用于位置参数从commander 9.4.1开始测试,位置参数的最佳选择似乎是
.argument
函数。该方法实现了您期望从一个像样的库中获得的基本特性:
program.allowExcessArguments(false)
的位置太多,则给予错误(可惜不是默认值)我们使用
program.namedArgs
是因为program.args
忽略了myParseInt
或默认值。TODO内置方式
program.processedArgs[0]
)访问位置参数(例如program.processedArgs.arg1
)样品使用:
positional.js
示例调用:
丑陋的原因:
而不是仅仅
program.args
有错误,既不使用myParseInt
(返回字符串),也不使用1
的默认值(只是忽略参数)。