【发布时间】:2022-07-06 07:04:22
【问题描述】:
picoCLI 的@-file 机制几乎是我需要的,但不完全是。原因是我想控制解析的其他文件的确切位置——取决于以前的选项值。
示例:使用选项调用时
srcfolder=/a/b optionfile=of.txt,我的程序应该会看到从/a/b/of.txt 读取的附加选项,但是当使用srcfolder=../c optionfile=of.txt 调用时,它应该会看到来自../c/of.txt 的选项。
@-file 机制无法做到这一点,因为它会在处理任何选项值之前扩展所有选项文件(总是相对于当前文件夹,如果它们是相对的)。
所以我想要 picoCLI...
- “从左到右”处理选项,
- 在
optionfile选项中提及选项文件时递归解析它, - 然后继续使用以下选项。
我也许可以通过从带注释的 setter 方法中递归地开始解析来解决这个问题:
...
Config cfg = new Config();
CommandLine cmd = new CommandLine(cfg);
cmd.parseArgs(a);
...
public class Config {
@Option(names="srcfolder")
public void setSrcfolder(String path) {
this.srcfolder=path;
}
@Option(names="optionfile")
public void parseOptionFile(String pathAndName) {
// validate path, do some other housekeeping...
CommandLine cmd = new CommandLine(this /* same Config instance! */ );
cmd.parseArgs(new String[] { "@"+this.srcfolder + pathAndName });
}
...
这样,多个CommandLine 实例将在同一个Config 实例上调用setter 方法,递归地相互“中断”。现在是真正的问题:这是一个问题吗?
当然,我的Config 类有状态。但是如果其他CommandLine 实例也修改cfg“在选项之间”,CommandLine 实例是否也有可能会搞砸的状态?
感谢您的任何见解!
编辑添加:我试过了,我在@-file 选项上得到一个UnmatchedArgumentException:
Exception in thread "main" picocli.CommandLine$UnmatchedArgumentException: Unmatched argument at index 0: '@/path/to/configfile'
at picocli.CommandLine$Interpreter.validateConstraints(CommandLine.java:13490)
...
所以首先我必须解决这个问题:显然 picoCLI 不会扩展 @-file 选项,除非它直接来自命令行。
【问题讨论】: