Picocli не сбрасывает поле сбора при каждом выполнении? - PullRequest
1 голос
/ 13 апреля 2020

Я недавно обновил свой проект до Picocli 4.2.0, включая удаление всех устаревших вызовов методов, и я продолжаю работу, которую я описал здесь . Я снова сталкиваюсь с той же проблемой - у меня есть поле, которое не сбрасывается. Единственное, что отличается от этого в моем другом вопросе, это то, что теперь поле является коллекцией. Код выглядит следующим образом:

@Command(name="watch", description="Alters the set of watched productions", subcommands={HelpCommand.class})
static public class Watch implements Runnable
{
    @ParentCommand
    ProductionC parent; // injected by picocli

    @Option(names={"on", "-e", "--on", "--enable"}, description="Enables watching of given productions")
    List<String> productionsToEnable;

    @Option(names={"off", "-d", "--off", "--disable"}, description="Disables watching of given productions")
    List<String> productionsToDisable;

    @Override
    public void run()
    { ... }

(полный код доступен здесь .)

В частности, productionsToEnable не сбрасывается. Способ выполнения вызова является частью модульного теста:

@Test
public void testCanListTracedRules() throws Exception
{
    loadRules();
    agent.getInterpreter().eval("production watch --on b");
    agent.getInterpreter().eval("production watch --on c");

    final StringWriter result = new StringWriter();
    agent.getPrinter().pushWriter(result);
    agent.getInterpreter().eval("production watch");
    agent.getPrinter().popWriter();
    assertEquals("b\nc", result.toString());
}

(полный код доступен здесь .)

Строка "c" из последнего вызов production watch все еще присутствует в productionsToEnable, когда команда production watch вызывается в последнем eval.

Обратите внимание, что приведенные выше ссылки на код находятся в ветке jsoar-command-performance, если это полезно чтобы присмотреться.

1 Ответ

0 голосов
/ 14 апреля 2020

В picocli 4.2.0 существует регрессия, которая означает, что @Option -аннотированные поля в подкомандах не сбрасываются до их исходного значения при повторном использовании экземпляра CommandLine.

Эта проблема отслеживается в средство отслеживания проблем проекта picocli в этот билет . (Состояние 2020-04-20: исправлено в master.)

Область действия

При использовании picocli 4.2.0 параметры подкоманд не сбрасываются между вызовами. Это влияет на приложения, которые повторно используют экземпляр CommandLine в нескольких вызовах . Если параметр был указан в первом вызове и пропущен во втором вызове, он неправильно сохранит значение из первого вызова.

Проблема не проявляется, когда подкоманда вызывается только один раз в процессе JVM. Кроме того, на приложения, которые не используют повторно экземпляр CommandLine, и приложения без подкоманд не влияют.

Эта проблема была введена в версии 4.2.0 и не существует в picocli 4.1.4 и более ранних версиях.

Обходной путь

Эта регрессия не применяется к опциям, для которых в аннотации определено defaultValue: опции, определенные как @Option(... defaultValue="..."), будут корректно сброшены к значению по умолчанию между несколькими вызовами. По возможности используйте аннотацию defaultValue.

Причина

Причина связана с недавними изменениями для экземпляров отложенных подкоманд и повторяемых подкоманд .

Билет на трекере проблем picocli содержит больше деталей и обновлений прогресса.

...