Как я могу разобрать комментарии yaml, используя Java? - PullRequest
0 голосов
/ 04 мая 2018

Я хочу использовать файл конфигурации yml в моем проекте. Я использую jackson-dataformat-yaml для анализа yml-файлов. Но мне нужно разобрать и комментарии yml. Я использовал аналогичный подход в Python, используя ruamel yaml. Как я могу сделать то же самое в Java?

Upd.

Зачем? Ну, я хотел сделать возможным переопределить мои параметры конфигурации, используя аргументы командной строки. Итак, чтобы сгенерировать описание для каждой опции, я хотел использовать мои комментарии. Как это:

По моему config.yml

# Define a source directory
src: '/foo/bar'

# Define a destination directory
dst: '/foo/baz'

Поэтому, когда вы запустите свою программу с флагом --help, вы увидите следующий вывод:

Your program can be ran with the following options: 
--src   Define a source directory
--dst   Define a destination directory

Основным преимуществом такой модели является то, что вам никогда не нужно повторять одно и то же утверждение дважды, поскольку их можно извлечь из файла конфигурации.

1 Ответ

0 голосов
/ 05 мая 2018

По сути, у вас есть три слоя данных:

  • Ваша схема конфигурации. Это определяет значения, которые должны быть определены в файле конфигурации.
  • Сам файл конфигурации, который описывает обычную конфигурацию на текущем компьютере.
  • Одноразовые переключатели, которые отменяют обычную конфигурацию.

Описание того, что каждое значение относится к схеме, а не к самому файлу конфигурации. Подумайте об этом: если кто-то отредактирует файл конфигурации на своем компьютере и изменит комментарии, ваш вывод справки внезапно покажет другое описание.

Я бы предложил добавить описания к схеме. Схема - это класс Java, в который вы загружаете свой YAML. Я не уверен, почему вы используете Джексона, так как он использует SnakeYaml в качестве парсера, а SnakeYaml прекрасно способен десериализовать в классы Java, но имеет больше опций конфигурации, поскольку он не обобщается на JSON и YAML, как это делает Джексон .

Вот общая идея, как это сделать с SnakeYaml (будьте осторожны, не проверено):

// ConfigParam.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConfigParam { String description(); }

// Configuration.java
public class Configuration {
    @ConfigParam("Define a source directory")
    String src;
    @ConfigParam("Define a destination directory")
    String dst;
}

// loading code
Yaml yaml = new Yaml(new Constructor(Configuration.class));
Configuration config = yaml.loadAs(input, Configuration.class);

// help generation code
System.out.println("Your program can be ran with the following options:")
for (Field field: Configuration.class.getFields()) {
    ConfigParam ann = field.getAnnotation(ConfigParam.class);
    if (ann != null) {
        System.out.println(String.format("--%s  %s", field.getName(), ann.description());
    }
}

Для отображения фактических параметров в конфигурацию вы также можете циклически перебирать поля классов и сопоставлять параметры с именами полей после после загрузки конфигурации (чтобы заменить стандартные значения заданными).

...