繁体   English   中英

当多个 CommandLine 实例在带注释的类的同一实例上“工作”时可能产生副作用?

[英]Possible side effects when several CommandLine instance "work" on the same instance of an annotated class?

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实例也“在选项之间”修改cfgCommandLine实例是否也有可能会搞砸的状态?

感谢您的任何见解!

编辑添加:我试过了,我在 @-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 选项,除非它直接来自命令行。

我确实让它工作了:几个 CommandLine 实例确实可以在一个带注释的类的同一个实例上工作,而不会相互干扰。

有一些问题,我不得不解决一个奇怪的 picoCLI 怪癖,但这不完全是这个问题的答案的一部分,所以我在另一个问题中解释了它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM