1

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

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

该应用程序具有用于DevelopmentStagingTest的环境Production。直到最近我才注意到这是在 staging 中运行的,我不确定它是如何或何时切换的,但在过去的几年里它在 dev 中运行得很好,我最近添加了一个 staging env 来帮助使用 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也返回“开发”。

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

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

4

2 回答 2

2

为了确保我清楚:

  • 您的本地应用程序正在“暂存”
  • 您希望本地应用程序在“开发”中运行
  • 您看到 puma 在“开发”中运行,但该应用程序似乎正在为“暂存”提取变量
  • 您希望 puma 在“开发”中运行,并且应用程序能够识别它处于“开发”中

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_ENVis development, but RAILS_ENVis staging,那么它们将不匹配。

尝试:

RAILS_ENV=development rails server

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

于 2020-10-28T18:06:55.370 回答
0

今天终于想通了。

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

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

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

彪马/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! 

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

于 2020-11-11T16:01:47.197 回答