代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

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

  •  15
  • Harish Shetty  · 技术社区  · 14 年前

    ruby在YAML中是否有一个自定义标记,可以在YAML文件中包含一个YAML文件?

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

    A. similar 前段时间有人问这个问题,但并没有相关的答案。

    我想知道是否有一些类似于Ruby的定制标签 this 一个是Python。

    7 回复  |  直到 6 年前
        1
  •  19
  •   the Tin Man    9 年前

    如果您在Rails中,YAML可以包含ERB。

    <%= %> 要包含另一个文件中的一个文件:

    <% if File.exists?('/tmp/mysql.sock') %>
    <%= IO.read('config/database.mysql.yml') %>
    <% else %>
    <%= IO.read('config/database.sqlite.yml') %>
    <% end %>
    

    数据库.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
    

    数据库.mysql.yml

    development:
      adapter: mysql2
      # ... the rest of your mysql configuration ...
    
        2
  •  14
  •   Harish Shetty    9 年前

    我找到了一种使用ERB解决我的场景的方法。

    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
    

    mod1:
        age: 30
        city: San Francisco
    

    mod2\u配置.yml

    mod2:
        menu: menu1
        window: window1
    

    所有配置yml

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

    YAML::load_erb 而不是方法 YAML::load .

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

    注意事项:

    1. 最后一个include覆盖相同的命名键
        3
  •  9
  •   skalee    14 年前

    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
  •  3
  •   user3232994    7 年前

    如果您只想从另一个YAML文件继承,那么有一个gem通过扩展ruby YAML库来提供您所要求的功能:

    https://github.com/entwanderer/yaml_extend

    https://rubygems.org/gems/yaml_extend

    此方法的工作方式与原始YAML#load#u文件类似,通过文件继承对其进行扩展。

    示例

    # 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'
    
        5
  •  2
  •   Pablo Torrecilla    13 年前

    加载配置.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']
    
        6
  •  1
  •   the Tin Man    9 年前
    1. !include 不是指令而是标记。
    2. 它不是Python(或PyYAML)的特性,而是“poze”库的特性:

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

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

        7
  •  0
  •   Rubycut    14 年前

    取决于你需要它做什么。如果需要传输文件,可以对内部yaml文件进行base64编码。