Ruby:如何从另一个文件导入变量?

ghi*_*man 5 ruby

我正在尝试创建一个与罗盘一起使用的本地配置文件,以便我们可以在开发人员的机器上处理不同的导入路径.到目前为止,我已经尝试在异常块中导入文件,如果它不存在,那么进一步使用该变量:

local_config.rb

VENV_FOLDER = 'venv'
Run Code Online (Sandbox Code Playgroud)

config.rb

VENV_FOLDER = '.'
begin
  require 'local_config.rb'
rescue LoadError
end
puts VENV_FOLDER
Run Code Online (Sandbox Code Playgroud)

一般情况下我是一个Python开发人员,所以我预计进口到改变的值VENV_FOLDERvenv,但它仍然是.事后.

有没有办法以local_config.rb这样的方式导入它覆盖的值VENV_FOLDER

Car*_*ter 12

其他替代品:

YAML(或JSON)

local_config.yml

venv_folder: 'venv'
Run Code Online (Sandbox Code Playgroud)

config.rb

require 'yaml'

VENV_FOLDER = begin
  YAML.load_file('local_config.yml').fetch('venv_folder')
rescue Errno::ENOENT, KeyError
  '.'
end

puts VENV_FOLDER
Run Code Online (Sandbox Code Playgroud)

类实例变量

您可以将值放在类实例变量中:

local_config.rb

Config.venv = 'venv'
Run Code Online (Sandbox Code Playgroud)

config.rb

class Config
  class << self ; attr_accessor :venv ; end
  self.venv = '.'
end

begin
  require './local_config.rb'
rescue LoadError
end

puts Config.venv
Run Code Online (Sandbox Code Playgroud)

常量

此外,坚持使用常量的ruby文件,以下可能在其意图中略微清楚,并避免必须捕获异常.

local_config.rb

VENV_FOLDER = 'venv'
Run Code Online (Sandbox Code Playgroud)

config.rb

config_file = './local_config.rb'
require config_file if File.file? config_file
VENV_FOLDER ||= '.'

puts VENV_FOLDER
Run Code Online (Sandbox Code Playgroud)

所有三种解决方案都有不同的机制来确保即使文件丢失或未按预期设置值也将设置该值.希望它有用