node.js - 应用相同标志的多个实例时自定义操作字符串解析?
问题描述
我有一个命令行程序,我想在给定多个参数的情况下生成一张图片,其中应该尊重参数的顺序,并且允许重复的参数
是否有任何允许这样做的 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 数组以使其进入这种状态可能并不难,但很好奇是否已经有任何可用的选项
解决方案
为了帮助我的特殊情况,我制作了这个实用功能
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 解析器无法实现的
推荐阅读
- tinyos - 在 TelosB 即 TinyOS 中运行 TestNetworkC.nc 时出现错误输出
- mininet - Mininet 净损失 <1%
- node.js - nodejs中的错误消息:后端返回代码400,正文为空
- c++ - std::move lambda 捕获中的 const std::vector
- javascript - CSS 动画会减慢桌面浏览器的速度,但不会减慢移动浏览器的速度
- citrus-framework - 如何使用 Citrus 框架单独运行测试方法?
- python - 如何安装 CVXPY / SCS 以与 GPU 一起使用?
- swift - Swift - 类方法中的 self.init() 没有创建正确的类型
- wso2 - WSO2 API:如何在 wso2 api 管理器和分析中创建自定义 api 使用统计信息
- docker - 无法在 docker 容器上运行 Heroku exec