首页 > 解决方案 > 应用相同标志的多个实例时自定义操作字符串解析?

问题描述

我有一个命令行程序,我想在给定多个参数的情况下生成一张图片,其中应该尊重参数的顺序,并且允许重复的参数

是否有任何允许这样做的 node.js optstring 解析器?

我想要类似的东西

generate_picture --red 100 --yellow 200 --red 100 --width 500

然后它生成一个“标志”,顶部有一个 100px 的红色带,然后是一个 200px 的黄色带,然后是另一个 100px 的红色带,全部应用宽度为 500px

我的程序并没有真正做到这一点,但它是相似的

我认为我的程序接收这些参数的理想形式是这样的数组数组

[
  ['red', 100],
  ['yellow', 200],
  ['red', 100],
  ['width', 500]
]

我可能会预先扫描这个数组数组以查找我希望只应用一次的东西,比如宽度

我想现在我把它写出来了,手动解析 process.argv 数组以使其进入这种状态可能并不难,但很好奇是否已经有任何可用的选项

标签: node.jscommand-line-interface

解决方案


为了帮助我的特殊情况,我制作了这个实用功能

function parseArgv(argv) {
  const map = [];
  while (argv.length) {
    const val = argv[0].slice(2);
    argv = argv.slice(1);
    const next = argv.findIndex((arg) => arg.startsWith("-"));

    if (next !== -1) {
      map.push([val, argv.slice(0, next)]);
      argv = argv.slice(next);
    } else {
      map.push([val, argv]);
      break;
    }
  }
  return map;
}

示例用法

test("parse", () => {
  expect(
    parseArgv(
      "--bam file1.bam color:red --vcf variants.vcf --bam file2.bam --defaultSession --out out.svg --fullSvg".split(
        " "
      )
    )
  ).toEqual([
    ["bam", ["file1.bam", "color:red"]],
    ["vcf", ["variants.vcf"]],
    ["bam", ["file2.bam"]],
    ["defaultSession", []],
    ["out", ["out.svg"]],
    ["fullSvg", []],
  ]);
});

然后后处理可以使这一点更有意义,但是这个实用函数对我的目的很有帮助,这是 yargs 或其他节点 optstring 解析器无法实现的


推荐阅读