Rails 应用程序如何设置其环境(开发、暂存等)?

How does a Rails app set its Environment (Dev., Staging, etc.)?

有一个非常令人困惑的问题

我的本地应用程序在其 staging 环境中 运行ning。我使用 puma-dev 作为服务器,当我用 运行ning tail -f ~/Library/Logs/puma-dev.log 拖尾它时,它说环境正在开发,但是当我使用 <%= Rails.env %> 注销到我的视图时,它说 staging 并且应用会尝试使用它需要的任何 staging 环境变量,而不是 development 环境的变量。

该应用程序具有 DevelopmentStagingTestProduction 的环境。直到最近,我才注意到这是 运行ning 在暂存阶段,我不确定它是如何或何时切换的,但在过去的几年里,它在开发中 运行ning 就好了,我最近添加了一个暂存环境以帮助 rails 升级,并且在上周的某个时间点开始 运行 暂存。

我一直认为这是在启动时由服务器设置的,但是 puma-dev 说它的环境是开发。我不知道这是如何尝试 运行 分期的。

puma-dev 启动时的输出:

io[19626]: Puma starting in single mode...
io[19626]: * Version 4.3.5 (ruby 2.4.6-p354), codename: Mysterious Traveller
io[19626]: * Min threads: 0, max threads: 5
io[19626]: * Environment: development

任何人都可以阐明 Rails 应用程序决定设置其环境的确切位置或方式,因为在我的生活中,我无法在应用程序中找到它。

作为基于以下答案的测试(这很有用),我注销了这 3 个变量:

  1. <%= Rails.env %> 结果是 staging
  2. <%= ENV["RAILS_ENV"] %> 结果什么也没显示
  3. <%= ENV["RACK_ENV"] %> 结果是 development

此外,如果我 运行 rails 控制台并输入 Rails.env 也是 returns 'development'.

我也在下面的答案中使用了建议 运行 RAILS_ENV=development rails server。这样做时,ENV["RAILS_ENV"]ENV["RACK_ENV"] 都设置为开发,但应用程序仍在 运行 阶段(因此上面的第一个变量没有改变,但第二个变量改变了)。

该应用仍在尝试使用已设置的所有暂存 ENV 变量(S3 等)。对于这个应用程序,我最近还从 Rails 3.* 更新到 4.2(我知道这些版本很旧。我继承了这些应用程序并正在开发它)。这就是添加暂存环境的原因。我在升级指南中找不到任何关于此类问题的内容,所以一开始我并不怀疑它是相关的,但我想就此问题提供尽可能多的信息。

为了确保我清楚:

  • 您的本地应用是 'staging'
  • 您希望您的本地应用在 'development'
  • 中 运行
  • 你在 'development' 中看到 puma 运行ning,但该应用程序似乎正在为 'staging'
  • 提取变量
  • 您希望 puma 运行ning 在 'development' 中并且应用程序能够识别它在 'development'

Puma setting its environment 是这样的:

:environment => -> { ENV['RACK_ENV'] || "development" }

Rails 集 .env like this:

# File railties/lib/rails.rb, line 73
def env
  @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development")
end

因此,如果 RACK_ENVdevelopment,但 RAILS_ENVstaging,那么他们将 mis-match。

尝试:

RAILS_ENV=development rails server

或者,在服务器 运行ning 时检查 ENV["RAILS_ENV"]ENV["RACK_ENV"] 的值。

今天终于想通了。

自从将暂存环境添加到应用程序后,我想我需要在应用程序本身的 puma 目录中添加一些配置文件,以帮助 puma 弄清楚它需要做什么。

老实说,我仍然不确定为什么我需要这个,因为 puma 会说它 运行 在开发中,我认为这是在设置环境。

我所做的是在 config 目录中添加一个 puma 目录,然后添加一个名为 development.rb 的文件,并将 运行 的设置放入开发环境。

puma/development.rb 的内容:

#!/usr/bin/env puma
root = "/Path/to/the/application"
daemonize false
environment "development"
directory root
pidfile "#{root}/tmp/pids/puma.pid"
stdout_redirect "#{root}/log/puma_stdout.log", "#{root}/log/puma_stderr.log", true
workers 2
threads 8,32
bind "unix:///#{root}/tmp/sockets/puma.sock"
bind "tcp://0.0.0.0:8080"
preload_app! 

它现在在我的本地机器上按预期运行。