【问题标题】:Why are my environment variables not being loaded properly before initialization code?为什么我的环境变量在初始化代码之前没有正确加载?
【发布时间】:2026-01-19 02:50:02
【问题描述】:

过去几天我一直在为我的项目启动并运行 redis/resque。我的初始化程序中有一些代码告诉 Resque 要使用的 redis 的 URL;此 URL 存储在环境变量中。初始化代码很简单:

Resque.redis = Redis.new(url: "#{ENV['REDISTOGO_URL']}")

现在,当我运行 rails server 时,这段代码运行良好。当我使用工头 (foreman start) 启动服务器时,它也运行良好。但是,当我尝试运行控制台时,它会出现以下错误:gems/redis-3.2.1/lib/redis/client.rb:405:in '_parse_options': invalid uri scheme '' (ArgumentError)。无论我尝试自行运行控制台 (rails console) 还是与工头 (foreman run rails console) 一起运行控制台,都会出现此错误。

通过排除过程,我确定错误是由上面的 Resque 初始化行引起的。当我将其注释掉时,控制台启动时没有任何问题。真正令人困惑的是,当我现在在工作控制台中执行该行时,它运行良好!经过一番摸索,似乎我的环境变量在初始化代码之前没有加载。

这是一个奇怪的问题。非常感谢任何帮助!

【问题讨论】:

  • 你是如何设置环境变量的?
  • 哪个特定的 Rails 4 版本? IIRC before_configuration 回调发生了变化。也许尝试备份一个版本(就像我猜你正在使用 4.2?),看看是否可以解决它,至少是暂时的。
  • 我正在从本地项目目录中的文件加载我的环境变量。我在启动控制台之前使用以下命令加载它们:source variables。我检查了运行 printenv 以确保它们在 shell 中正确加载,并且我可以确认 REDISTOGO_URL 已正确定义。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

所以,经过大量挖掘,我发现这个问题似乎与 Spring(添加到 Rails 4.1)有关,它会在后台预加载您的应用程序实例。

令人困惑的是,这只影响了我代码中的 Rails 初始化程序……加载控制台后,我可以毫无问题地访问正确的环境变量。

“修复”相当简单。您只需在再次运行控制台之前运行spring stop。您还可以更新 spring 以密切关注您的任何环境文件,以便在将来更改时正确预加载它们。有关设置 spring 以正确观看您的 env 文件的更多详细信息,请参阅this SO answer

【讨论】:

    最近更新 更多