YAML Ruby加载多个环境变量

时间:2014-11-20 17:51:40

标签: ruby environment-variables yaml config environment

我继承了一个正常工作的工具但是当我尝试扩展它时它就失败了。因为我是ruby和yaml的新手,所以我真的不知道为什么会失败...

所以我有一个看起来像这样的类配置

  class Configuration
    def self.[] key
      @@config[key]
    end

    def self.load name
      @@config = nil
      io = File.open( File.dirname(__FILE__) + "/../../../config/config.yml" )
      YAML::load_documents(io) { |doc| @@config = doc[name] }
      raise "Could not locate a configuration named \"#{name}\"" unless @@config
    end

    def self.[]=key, value
      @@config[key] = value
    end

  end
end

raise "Please set the A environment variable" unless ENV['A']
Helpers::Configuration.load(ENV['A'])

raise "Please set the D environment variable" unless ENV['D']
Helpers::Configuration.load(ENV['D'])

raise "Please set the P environment variable" unless ENV['P']
Helpers::Configuration.load(ENV['P'])

所以我有一个环境变量A的第一个版本运行正常,然后当我想要集成另外两个环境变量时,它失败了(它们是不同的键/值集)。我做了调试它,看起来当它读取第二个键/值时,它删除了其他的(如读取第3个删除了前2个,所以我最终得到@@ config只有第3个键/值par而不是我需要的所有价值观。)

这可能很容易解决,任何想法如何?

谢谢!

编辑: 配置文件看起来像:

Test:
  position_x: “56”
  position_y: “56”

现在我想把它变成

“x56”:
  position_x: “56”

“x15”:
  position_x: “15”

“y56”:
  position_y: “56”

“y15”:
  position_y: “15”

我的想法是我将它们分开设置,我不需要创建所有组合......

2 个答案:

答案 0 :(得分:0)

每次拨打load时,都会删除之前的配置(在@@config = nil行中)。如果您希望将配置合并为所有文件,则需要将新配置合并到现有配置而不是覆盖它。

这样的事情:

def self.load name
  @@config ||= {}
  io = File.open( File.dirname(__FILE__) + "/../../../config/config.yml" )
  YAML::load_documents(io) do |doc| 
    raise "Could not locate a configuration named \"#{name}\"" unless doc[name]
    @@config.merge!(doc[name])
  end
end

请注意,如果代码是按原样编写的,因为 方法被多次调用,并且预期在读取之间重置,那么您将现在需要明确重置配置:

class Configuration

  # ...

  def reset_configuration
    @config = {}
  end
end

Helpers::Configuration.reset_configuration

raise "Please set the A environment variable" unless ENV['A']
Helpers::Configuration.load(ENV['A'])

raise "Please set the D environment variable" unless ENV['D']
Helpers::Configuration.load(ENV['D'])

raise "Please set the P environment variable" unless ENV['P']
Helpers::Configuration.load(ENV['P'])

答案 1 :(得分:0)

我使用以下方式访问YAML:

YAML::load_file(File.expand_path("../../../config/config.yml", File.dirname(__FILE__)))

expand_path清理'..'链并返回相对于 FILE 的已清理版本。例如:

foo = '/path/to/a/file'
File.expand_path("../config.yml", File.dirname(foo)) # => "/path/to/config.yml"

load_file读取并解析整个文件并将其返回。