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

Har*_*tty 17 ruby yaml ruby-on-rails

在YAML中是否有自定义标记,以便在YAML文件中包含YAML文件?

#E.g.:  
--- !include
filename: another.yml
Run Code Online (Sandbox Code Playgroud)

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

我想知道是否有是Ruby一些自定义标签类似这样一个为Python.

小智 17

如果你在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 %>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

database.mysql.yml

development:
  adapter: mysql2
  # ... the rest of your mysql configuration ...
Run Code Online (Sandbox Code Playgroud)


Har*_*tty 14

我找到了一种使用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
Run Code Online (Sandbox Code Playgroud)

我有三个YAML文件.

mod1_config.yml

mod1:
    age: 30
    city: San Francisco
Run Code Online (Sandbox Code Playgroud)

mod2_config.yml

mod2:
    menu: menu1
    window: window1
Run Code Online (Sandbox Code Playgroud)

all_config.yml

<%= YAML::include("mod1_config.yml") %>
<%= YAML::include("mod2_config.yml") %>
Run Code Online (Sandbox Code Playgroud)

使用方法YAML::load_erb而不是方法解析yaml文件YAML::load.

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

注意事项:

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


ska*_*lee 8

如果你的目标是避免在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
Run Code Online (Sandbox Code Playgroud)

  • 您可能需要`YAML :: ENGINE.yamler ='syck'才能正常工作http://stackoverflow.com/a/6140900/414220 (2认同)