Существует ли пользовательский тег в YAML для рубина для включения файла YAML в файле YAML?
#E.g.:
--- !include
filename: another.yml
Подобный вопрос задали некоторое время назад и не было никакого соответствующего ответа.
Я задаюсь вопросом, существует ли некоторый пользовательский тег для Ruby, подобного этому для Python.
Я нашел способ обратиться к моему сценарию с помощью 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
Предостережения:
!include
- это не директива, а тег. это не особенность Python (или PyYAML), а особенность библиотеки "poze":
poze.configuration выставляет директиву по умолчанию с именем include.
Спецификация YAML не определяет такой стандартный тег.
Зависит от того, для чего вам это нужно. Если вам нужно перенести файл, вы можете кодировать base64 внутренний файл yaml.
Если ваша цель - избежать дублирования в вашем 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