如何在Ruby中的YAML文件中包含YAML文件

在YAML中是否有自定义标记用于ruby以在YAML文件中包含YAML文件?

#Eg: --- !include filename: another.yml 

前一段时间问了一个类似的问题,没有相关的答案。

我想知道是否有一些类似于Python的自定义标记用于Python。

如果您在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 ... 

我找到了一种使用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::load_erb而不是YAML::load方法解析yaml文件。

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

注意事项:

  1. 不支持文档合并
  2. 最后包括覆盖相同的命名键

如果您的目标是避免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 

我正在使用这个:

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'] 
  1. !include不是指令而是标签。
  2. 它不是Python(或PyYAML)的一个function,而是“poze”库的一个特性:

    poze.configuration公开了一个名为include的默认指令。

  3. YAML规范没有定义这样的标准标签。

如果您只想inheritance另一个YAML文件,那么有一个gem可以通过扩展ruby YAML库来提供您要求的function:

https://github.com/entwanderer/yaml_extend

https://rubygems.org/gems/yaml_extend

用法

yaml_extend将方法YAML#ext_load_file添加到YAML。

此方法与原始YAML#load_file类似,通过文件inheritance扩展它。

例子

 # start.yml extends: 'super.yml' data: name: 'Mr. Superman' age: 134 favorites: - 'Raspberrys' 

 # super.yml data: name: 'Unknown' power: 2000 favorites: - 'Bananas' - 'Apples' 

基本inheritance

 YAML.ext_load_file('start.yml') 

结果是

 data: name: 'Mr. Superman' age: 134 power: 2000 favorites: - 'Bananas' - 'Apples' - 'Raspberrys' 

取决于你需要它。 如果需要传输文件,可以使用base64编码内部yaml文件。