我正在尝试创建一个用于指南针的本地配置文件,以便我们可以在开发人员的计算机上处理不同的导入路径。到目前为止,我已经尝试在异常块中导入文件,如果它不存在,那么进一步使用该变量:
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
,但之后它仍为.
。
有没有办法导入local_config.rb
,使其覆盖VENV_FOLDER
的值?
答案 0 :(得分:12)
其他替代方案:
<强> 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文件,以下内容的意图可能略微清楚,并避免必须捕获异常。
<强> 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
所有三种解决方案都有不同的机制来确保即使文件丢失或未按预期设置值也将设置该值。希望它有用
答案 1 :(得分:1)
文件的路径错误。如果未从$ 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。 p>
然而,不断重新分配是一个坏主意。 Ruby会让你这样做,但你会收到警告。我相信你的困惑只是与LoadError有关。
答案 2 :(得分:0)
尝试这样的事情:
<强> 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