一个Rails应用如何设置其环境(开发、测试等)?

3

遇到了一个非常混乱的问题

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

该应用程序具有DevelopmentStagingTestProduction环境。直到最近,我才注意到它正在运行staging,我不确定它是如何或何时切换过来的,但在过去的几年中它一直在dev上良好运行,最近添加了一个staging env以帮助rails升级,在过去的一周中,这个应用程序开始在staging下运行。

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

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,它也会返回“development”。
我还使用下面答案中的建议运行了RAILS_ENV=development rails server。这样做时,ENV["RAILS_ENV"]和ENV["RACK_ENV"]都设置为开发环境,但应用程序仍在staging模式下运行(因此上面的第一个变量未更改,但第二个变量已更改)。
该应用程序仍然尝试使用所有已设置的staging环境变量(S3等)。对于这个应用程序,我最近从Rails 3.*更新到4.2(我知道这些版本很旧。我继承了这些应用程序并正在处理它们)。这是添加staging环境的原因。我无法在升级指南中找到任何关于这种问题的讨论,因此起初我并没有怀疑它与此有关,但我想在此问题上提供尽可能多的信息。

https://guides.rubyonrails.org/configuring.html#creating-rails-environments - undefined
@tar,哥们儿,我已经创建了临时环境。但这并不是我问题的关键所在。 - undefined
@RockwellRice 你是用 rails server -e staging 命令启动服务器吗?根据你的问题,@tar 的评论似乎正是你所需要的。在你的回答中包含更多的代码将有助于我们不假设你还没有完成某些操作。 - undefined
@Chiperific 我不是,服务器是puma-dev,并且正如我在问题中明确提到的那样,它显示正在运行开发模式,这就是为什么我对此感到困惑。我非常乐意包含任何相关的代码来帮助解决问题,但我不确定应该添加哪些代码,你想要我添加哪些代码来帮助?我已经添加了来自puma-dev的输出和我用于显示环境的命令,如果还有其他需要,请告诉我,我会添加进去。 - undefined
根据你的更新,初始化器中的某个内容将你的本地环境设置为“staging”,修复这个问题可能会解决你的困扰。我猜当你添加了你的staging环境时,你添加了一段代码,它总是将你设置为staging状态。 - undefined
显示剩余2条评论
2个回答

4

为了确保我表述清楚:

  • 你的本地应用程序是"staging"
  • 你想让你的本地应用程序运行在"development"模式下
  • 你看到Puma正在以"development"模式运行,但似乎应用程序还是在调用"staging"变量
  • 你想让Puma以"development"模式运行,并且应用程序也能够识别当前处于"development"模式

Puma是通过以下方式设置其环境的:

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

Rails 将.env 配置文件设置为与这里类似的格式。
# 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,那么它们将不匹配。

尝试:

RAILS_ENV=development rails server

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


谢谢你的帮助。根据你的指导,我注意到ENV["RAILS_ENV"]没有返回任何值,但ENV["RACK_ENV"]返回了development。所以可能是前者出了问题。我会去查一下。再次感谢你的解释,希望我能解决这个问题。 - undefined
是的,我猜测在添加staging环境时,你可能改变了某些东西,导致ENV["RAILS_ENV"]被取消设置(或未能设置),找出这个问题可能会解决你的两个问题。 - undefined

1

今天终于弄清楚了。

自从将staging环境添加到应用程序中后,我想我需要在应用程序本身的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! 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接