首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby配置:替换dev环境的嵌套键值不起作用

Ruby配置:替换dev环境的嵌套键值不起作用
EN

Stack Overflow用户
提问于 2013-01-08 07:42:31
回答 1查看 181关注 0票数 0

案例:开发环境日志级别是DEBUG,而生产是INFO。我想使用每个默认的日志配置,并且只在环境==开发时才覆盖级别。

问题:第一级配置可以覆盖,但不能覆盖子级别。

考虑示例代码:

代码语言:javascript
复制
#file: config.rb

default = Configuration.for('default'){
  log {
    file '/tmp/foo.log'
    level 'WARN'
    freq 'daily'
  }
}

development = Configuration.for( 'development', default) {
  log {
    level 'DEBUG'
  }
}

在主文件中,我使用上面的代码,如下所示

代码语言:javascript
复制
# main.rb

require 'config.rb'    
$CONFIG = Configuration.for $DEV_ENV # either ('default' || 'development')
p $CONFIG.log.freq

我得到一个方法缺失的错误:

代码语言:javascript
复制
`undefined method `freq' for #<Configuration:0x00000003a65d80> (NoMethodError)`

我唯一的(丑陋的)解决方案是将文件和频率值指向默认值,如下所示:

代码语言:javascript
复制
  log {
    file default.log.file
    level 'DEBUG'
    freq default.log.freq
  }

恶!!太恶心了!

还有其他建议吗?我也尝试过用SettingsLogic和Configatron实现类似的东西,但都无济于事。这里有三个Ruby的顶级配置宝石。我需要自己做吗??这真的是一个异国情调的例子吗?

希望得到您的反馈或建议。

EN

回答 1

Stack Overflow用户

发布于 2020-06-16 04:49:51

我解决了你在YAML中使用SettingsLogic和锚标签的问题。

我的配置文件:

代码语言:javascript
复制
defaults: &defaults
  log: &logdefault
      file:  /tmp/foo.log
      level: WARN
      freq: daily

development:
  <<: *defaults
  log:
      <<: *logdefault
      level: DEBUG

test:
  <<: *defaults

production:
  <<: *defaults

诀窍是将默认值存储在锚点标签中,并在尝试重新定义其中的一部分时重新使用它。每个关卡都需要一个锚点。

您可以将其用作

代码语言:javascript
复制
require 'settingslogic'  #https://github.com/settingslogic/settingslogic
class SettingsDEV < Settingslogic
  source "./application.yml"
  namespace 'development'
end
p SettingsDEV.log #{"file"=>"/tmp/foo.log", "level"=>"DEBUG", "freq"=>"daily"}

class SettingsProd < Settingslogic
  source "./application.yml"
  namespace 'production'
end
p SettingsProd.log  #{"file"=>"/tmp/foo.log", "level"=>"WARN", "freq"=>"daily"}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14206046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档