【问题标题】:Node.js commander with optional+variadic arguments带有可选+可变参数的 Node.js 指挥官
【发布时间】:2017-10-30 19:16:50
【问题描述】:

我正试图让节点的commander 模块以我想要的方式解析参数。

我希望将文件列表上传到命名数据库。有一个默认数据库名称,因此用户不应该需要包含数据库参数。

我希望此命令按以下方式工作:

>>> ./upload.js --db ReallyCoolDB /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to database "ReallyCoolDB")

>>> ./upload.js /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to the default database)

>>> ./upload.js --db ReallyCoolDB
(returns an error; no files provided)

如何使用commander 实现这一点?我已经尝试了很多东西,目前我被这个不起作用的代码卡住了:

// upload.js:

#!/usr/bin/env node

var program = require('commander');
program
  .version('0.1.0')
  .description('Upload files to a database')
  .command('<path1> [morePaths...]')
  .option('-d, --db [dbName]', 'Optional name of db', null)
  .action(function(path1, morePaths) {

    // At this point I simply want:
    // 1) a String "dbName" var
    // 2) an Array "paths" containing all the paths the user provided
    var dbName = program.db || getDefaultDBName();
    var paths = [ path1 ].concat(morePaths || []);
    console.log(dbName, paths);

    // ... do the upload ...

  })
  .parse(process.argv);

当我尝试运行 ./upload.js 时,我没有得到任何输出!

如何使用指挥官来接受单个可选参数和非空字符串列表?

编辑:感谢 Rob Raisch 的回答,我已经解决了我的问题!解决方案是使用usage 而不是action,在program 命令之后(而不是在action 函数内)完成所有工作,使用program.dbprogram.args,并手动确保@987654332 @ 非空:

var program = require('commander');

program
    .version('0.1.0')
    .description('Upload files to a database')
    .usage('[options] <path1> [morePaths ...]') // This improves "--help" output
    .option('-d, --db [dbName]', 'Optional name of db', null)
    .parse(process.argv);

var dbName = program.db || getDefaultDBName();
var paths = program.args;

if (!paths.length) {
    console.log('Need to provide at least one path.');
    process.exit(1);
}

// Do the upload!

【问题讨论】:

    标签: node.js node-commander


    【解决方案1】:

    commander 命令行处理模块的README.md 文件在其第二段中回答了您的用例:

    “带有commander的选项是用.option()方法定义的,也作为选项的文档。下面的例子从process.argv解析args和options,剩下的args作为program.args 未被选项消耗的数组。”

    【讨论】:

    • 那么用commander接受可选参数+非空列表的正确方法是什么?是否应该使用commander解析可选参数,然后手动解析program.args
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2015-05-26
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多