Как включить файл YAML в файл YAML?
Есть ли в YAML пользовательский тег для ruby для включения файла YAML в файл YAML?
#E.g.:
--- !include
filename: another.yml
A аналогичный вопрос был задан некоторое время назад, и не было соответствующего ответа.
Мне интересно, есть ли какой-то пользовательский тег для Ruby, похожий на этот для Python.
Ответы
Ответ 1
Я нашел способ обратиться к моему сценарию с помощью 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
Предостережения:
- Не поддерживает слияние документов
- Последнее включение перезаписывает те же именованные ключи
Ответ 2
Если вы находитесь в Rails, YAML может включать ERB.
Объедините это вместе, и вот как вы можете использовать <%= %>
для включения одного файла из другого:
database.yml
<% if File.exists?('/tmp/mysql.sock') %>
<%= IO.read('config/database.mysql.yml') %>
<% else %>
<%= IO.read('config/database.sqlite.yml') %>
<% end %>
database.sqlite.yml
sqlite: &defaults
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *defaults
database: db/development.sqlite3
test:
<<: *defaults
database: db/test.sqlite3
production:
<<: *defaults
database: db/production.sqlite3
database.mysql.yml
development:
adapter: mysql2
# ... the rest of your mysql configuration ...
Ответ 3
Если ваша цель состоит в том, чтобы избежать дублирования в вашем файле 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
Ответ 4
Я использую это:
load_config.rb (инициализатор)
cf_1 = YAML::load(File.read("/etc/my_app/config.yml"))
cf_2 = YAML::load(File.read(File.join(Rails.root, "config", "config.yml")))
CONFIG = cf_1.merge(cf_2)
Позже вы можете получить доступ к значениям конфигурации, выполнив следующие действия:
CONFIG['value']
Ответ 5
-
!include
не является директивой, а тегом.
-
это не функция Python (или PyYAML), а функция библиотеки "poze":
poze.configuration предоставляет директиву по умолчанию include.
-
Спецификация YAML не определяет такой стандартный тег.
Ответ 6
Зависит от того, для чего вам это нужно. Если вам нужно переносить файл, вы можете кодировать внутренний файл yaml base64.
Ответ 7
Если вы просто хотите наследовать от другого файла YAML, есть камень, предоставляющий эту функцию, которую вы запрашиваете, расширяя библиотеку YAML ruby:
https://github.com/entwanderer/yaml_extend
https://rubygems.org/gems/yaml_extend
Использование
yaml_extend добавляет метод YAML # ext_load_file в YAML.
Этот метод работает как исходный файл загрузки YAML #, расширяя его с наследованием файлов.
Примеры
# start.yml
extends: 'super.yml'
data:
name: 'Mr. Superman'
age: 134
favorites:
- 'Raspberrys'
-
# super.yml
data:
name: 'Unknown'
power: 2000
favorites:
- 'Bananas'
- 'Apples'
Основное наследование
YAML.ext_load_file('start.yml')
приводит к
data:
name: 'Mr. Superman'
age: 134
power: 2000
favorites:
- 'Bananas'
- 'Apples'
- 'Raspberrys'