我继承了一个正常工作的工具但是当我尝试扩展它时它就失败了。因为我是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”
我的想法是我将它们分开设置,我不需要创建所有组合......
答案 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
读取并解析整个文件并将其返回。