【问题标题】:How to include a YAML file inside a YAML file in Ruby如何在 Ruby 中的 YAML 文件中包含 YAML 文件
【发布时间】:2011-01-17 16:57:17
【问题描述】:

在 YAML 中是否有自定义标签,让 ruby​​ 可以在 YAML 文件中包含 YAML 文件?

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

前段时间有人问过similar 的问题,但没有相关答案。

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

【问题讨论】:

标签: ruby-on-rails ruby yaml


【解决方案1】:
  1. !include 不是指令而是标签。
  2. 它不是 Python(或 PyYAML)的一个特性,而是“poze”库的一个特性:

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

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

【讨论】:

  • YAML 规范没有标签 !include。我希望有人编写了一个类似于“poze”库中的自定义标签的自定义标签。我想是时候自己编写自定义标签了:-)
【解决方案2】:

我找到了一种使用 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. 最后一个包含覆盖同名键

【讨论】:

  • 我收到错误private method 'include' called for Psych:Module (NoMethodError) 任何猜测我该如何解决?我在initializers/yaml.rb 中添加了 YAML 模块
【解决方案3】:

看你需要什么。如果需要传输文件,可以base64编码内部yaml文件。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

    我正在使用这个:

    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']
    

    【讨论】:

      【解决方案6】:

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

      将它们组合在一起,您可以使用&lt;%= %&gt; 包含另一个文件:

      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 ...
      

      【讨论】:

        【解决方案7】:

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

        https://github.com/entwanderer/yaml_extend

        https://rubygems.org/gems/yaml_extend

        用法

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

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

        示例

        # 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'
        

        【讨论】:

          猜你喜欢
          • 2010-10-06
          • 2021-08-20
          • 2017-05-19
          • 1970-01-01
          • 2018-08-09
          • 2020-09-02
          • 2011-04-22
          • 2018-11-27
          相关资源
          最近更新 更多