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

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

local_config.rb

VENV_FOLDER = 'venv' 

config.rb

 VENV_FOLDER = '.' begin require 'local_config.rb' rescue LoadError end puts VENV_FOLDER 

通常我是Python开发人员所以我希望导入将VENV_FOLDER的值VENV_FOLDERvenv ,但它仍然是. 然后。

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

其他选择:

YAML(或JSON)

local_config.yml

 venv_folder: 'venv' 

config.rb

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

类实例变量

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

local_config.rb

 Config.venv = 'venv' 

config.rb

 class Config class << self ; attr_accessor :venv ; end self.venv = '.' end begin require './local_config.rb' rescue LoadError end puts Config.venv 

常量

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

local_config.rb

 VENV_FOLDER = 'venv' 

config.rb

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

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

该文件的路径是错误的。 如果未从$ LOAD_PATH加载,则需要包含斜杠。

您的LoadError正在静默捕获。

如果你这样做:

 VENV_FOLDER = '.' begin require './local_config.rb' rescue LoadError end puts VENV_FOLDER 

然后你会发现它有效。

更好的是:

 VENV_FOLDER = '.' require File.expand_path('../local_config.rb', __FILE__) rescue LoadError puts VENV_FOLDER 

由于第二个版本不依赖于调用脚本的用户的PWD。

然而,不断重新分配是一个坏主意。 Ruby会让你这样做,但你会收到警告。 我相信你的困惑只是与LoadError有关。

尝试这样的事情:

local_config.rb

 VENV[:folder] = 'venv' 

config.rb

 VENV = {:folder => '.'} begin load 'local_config.rb' rescue Exception end puts VENV[:folder] 

这是ruby 1.9.3的工作版本: https : //gist.github.com/1501237

对于ruby 1.8.7: https : //gist.github.com/1501321