【发布时间】:2020-02-05 11:07:30
【问题描述】:
背景
我有一个项目结构,其中有一个 .rb 文件,其中包含散列中的数据,这不是文件中唯一的内容:
name "vm"
description "Configuration file for the Demo VM"
default_attributes(
custom_demo: {
verticals: {
fashion: true,
automotive: false,
fsi: false,
custom: true
},
channels: {
b2b: true,
b2c: true
},
geos: [
'us_en'
]
},
infrastructure: {
php: {
version: '7.3',
port: 9000
},
webserver: {
http_port: 80,
ssl_port: 443
},
database: {
user: 'magento',
password: 'password',
name: 'magento'
},
elasticsearch: {
use: true,
version: '6.x',
memory: '1g',
port: 9200,
plugins: ['analysis-phonetic', 'analysis-icu']
},
mailhog: {
use: true,
port: 10000
},
webmin: {
use: true,
port: 20000
},
samba: {
use: true,
shares: {
composer_credentials: true,
image_drop: true,
web_root: true,
app_modules: true,
multisite_configuration: true,
app_design: true
}
}
}
在另一个 ruby 脚本中,我需要使用这个 default_attributes 哈希中的值来做其他事情。
我的问题
在另一个 ruby 脚本中使用上述 ruby 哈希的最佳方法是什么?
我的尝试
首先我尝试使用load() 来“加载”带有哈希的文件。由于前两行,这引发了一个问题:
name "vm"
description "Configuration file for the Demo VM"
所以,我想我应该把它读成一个字符串或一个数组并跳过前两行:
data_string = ''
data = File.readlines(File.dirname(File.expand_path(__FILE__)) + '/environments/vm.rb').drop(2).each do |line|
data_string += line
end
data_hash = JSON.parse(data_string)
print data_hash
这种方法做了两件我不喜欢的事情:首先,它将结果打印到屏幕上,其次,它会出错:
/opt/vagrant/embedded/lib/ruby/2.4.0/json/common.rb:156:in `parse': 751: unexpected token at 'verticals: { (JSON::ParserError)
正是在这一点上,我开始怀疑我的方法,想知道我想做的事情是否可能。为了澄清,理想情况下,在弄清楚如何在另一个脚本中解析上述文件之后,我可以使用哈希中的一些东西,比如:
default_attributes[:infrastructure][:php][:version]
# => 7.3
【问题讨论】: