信息化建设办公室网站,搜索百度网页版,长沙岳麓区房价新楼盘房价,武昌建设局网站前几天我写了一个简单的词法分析器项目#xff1a;https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中#xff0c;我需要通过命令行参数给这个 java 程序传递一些参数。
这个工作让我想起了一些不好的回忆…前几天我写了一个简单的词法分析器项目https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中我需要通过命令行参数给这个 java 程序传递一些参数。
这个工作让我想起了一些不好的回忆。我这些年来做过太多类似的东西随着程序开发的进展命令行参数的规则越来越复杂于是简单的几个赋值操作迅速变成了一大堆逻辑分支。
对于 Python 程序至少内置的命令行解释工具 argparse 足够好用对于通常 的开发工作已经足够。但是 Java 标准库中并没有这样的组件。
目前我所知道的apache commons cli 或许是个好选择。但是我也有一些自己特定的期待
我希望有一个能够很方便的和 jaskell try 机制良好配合的工具希望它的构造足够方便对我常用的命令行设计风格有足够的支持具体的内容后面我会介绍
于是我顺手在 jaskell-rocks 库中加入了一个 ArgParser 工具用于处理以下的命令行设计
option: 可以指定 --xxx 类型的参数这类参数需要带有参数值 option 可以有默认值option 可以是 required 或者可选的option 可以设置为只能在某几个值中选择允许多次传入同一个 option 名的参数所有同名 option 的参数聚合为一个集合 with optionwith option 不需要带有值 可以通过 --with-xxx 或 --without-xxx 表示某个 with option 是否设定with option 有默认值但是没有 required 限制 switch 开关 开关有默认值可以通过 --enable-xxx 或 --disable-xxx 表示一个 switch 的状态switch 有默认值switch 有 required 或可选的状态 args 前面介绍的三类都是有显式参数名的参数项在其后可以有零到多个无名参数这些参数可以隐含有 require 约束例如复制操作必须要提供 source 和 targetargs 的 size 就至少需要为 2args 参数也有可能有默认值例如一个连接http服务的调试脚本可能默认连接 localhost:8080 没必要显式给出。显然required args 应该在 所有 args 的最前面而有默认值的应该在最后 help 所有显式设定的参数都允许提供 help 文本argParser 内置对 --help-h 的识别输出参数的文档允许为参数名设置缩写例如 --source 可以设定为 -s 。
目前的 ArgParser 已经完全满足我的需要例如 oliva 的 lora 数据生成工具就使用了这个命令行解释器 var lexer new LexerRouter();var source Option.create(source).help(source project directory).required(true);var target Option.create(target).help(where save lora train dataset).required(true);var argParser ArgParser.create().header(Oliva is a assistant program. It just cut source code to lora training data.).formatter(%1$-20s %2$-20s %3$-60s\n).option(source).option(target).footer(Power by Jaskell);argParser.parse(args).onFailure(err - {System.err.println(err.getMessage());}).onSuccess(result - {result.autoHelp();//...这里就是 lora-data-generator 项目的参数解析部分。如果传入了 help 参数autoHelp 会向控制台打印帮助然后 System.exit(0) 退出。如果 需要深度的控制help行为这个解释器还暴露了几个与帮助文档有关的中间方法包括帮助格式的模板字符串。这个工具已经初步满足了我的需要在未来也 许我会加入一些便利的工具方法类似 intValue 这种。但是总的来说这个设计不需要再有大的改动如果真的遇到在结构上不能满足我的需求也许我会 考虑 apache commons cli。