Как включать файл YAML в файле YAML в Ruby

Существует ли пользовательский тег в YAML для рубина для включения файла YAML в файле YAML?

#E.g.:  
--- !include
filename: another.yml

Подобный вопрос задали некоторое время назад и не было никакого соответствующего ответа.

Я задаюсь вопросом, существует ли некоторый пользовательский тег для Ruby, подобного этому для Python.

17
задан Harish Shetty 24 May 2018 в 04:58
поделиться

4 ответа

Я нашел способ обратиться к моему сценарию с помощью ERB.

Я исправил модуль YAML, чтобы добавить два новых метода

module YAML
    def YAML.include file_name
      require 'erb'
      ERB.new(IO.read(file_name)).result
    end

    def YAML.load_erb file_name
      YAML::load(YAML::include(file_name))
    end  
end

У меня есть три файла YAML.

mod1_config.yml

mod1:
    age: 30
    city: San Francisco

mod2_config.yml

mod2:
    menu: menu1
    window: window1

all_config.yml

<%= YAML::include("mod1_config.yml") %>
<%= YAML::include("mod2_config.yml") %>

Анализируйте файл yaml, используя метод YAML :: load_erb вместо метода YAML :: load .

  config = YAML::load_erb('all_config.yml') 
  config['mod1']['age'] # 30
  config['mod2']['menu'] # menu1

Предостережения:

  1. Не поддерживает объединение документов
  2. Последнее включение перезаписывает ключи с одинаковыми именами
14
ответ дан 30 November 2019 в 11:04
поделиться
  1. !include - это не директива, а тег.
  2. это не особенность Python (или PyYAML), а особенность библиотеки "poze":

    poze.configuration выставляет директиву по умолчанию с именем include.

  3. Спецификация YAML не определяет такой стандартный тег.

1
ответ дан 30 November 2019 в 11:04
поделиться

Зависит от того, для чего вам это нужно. Если вам нужно перенести файл, вы можете кодировать base64 внутренний файл yaml.

0
ответ дан 30 November 2019 в 11:04
поделиться

Если ваша цель - избежать дублирования в вашем YAML-файле, не обязательно включая внешний файл, я рекомендую сделать что-то вроде этого:

development: &default
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: db_dev
  pool: 5
  username: usr
  password: psw
  host: localhost
  port: 3306

dev_cache:
  <<: *default

new:
  <<: *default
  database: db_new

test:
  <<: *default
  database: db_test
8
ответ дан 30 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: