【问题标题】:Rake not using the same environment value as phusion passenger setting耙子不使用与 phusion 乘客设置相同的环境值
【发布时间】:2014-08-04 12:19:12
【问题描述】:

在我的虚拟主机中,我有:

<Directory /var/www/prod/myapp/myapp/public>
  ...
  RailsEnv production
  ...
</Directory>

虽然任何依赖于 production 的代码都在应用程序本身中正确运行(例如:如果 Rails.env.production? 则显示 Google Analytics 代码),当我从 /var/www/prod/myapp/myapp 运行 rake about 时,我得到:

Application root          /var/www/prod/myapp/myapp
Environment               development
Database adapter          mysql2

这意味着我必须在任何与部署相关的 rake 内容前加上 RAILS_ENV=production。诚然,此时这一切都在部署脚本中,所以这并不重要,但为什么 Rake 不知道它是生产环境?乘客设置还不够吗?如果没有,我该如何解决它,这样我就不需要手动指定环境了?

旁注:我在同一个盒子上运行应用程序的开发实例,在其相应的虚拟主机配置中将环境设置为开发。

编辑:Phusion 乘客版本 4.0.20

【问题讨论】:

  • 您在使用 Capistrano 吗? rvm?两者都有?
  • rvm,是的,Capistrano,没有。
  • 可能问题来自您的部署。你是干什么用的?
  • 重新阅读我发布的内容。我的部署脚本没有任何问题,因为它为命令明确指定了 RAILS_ENV 变量。问题是在给定配置的 rake 级别是否有必要这样做。

标签: ruby-on-rails environment-variables passenger


【解决方案1】:

但为什么 Rake 不知道它正在生产?

因为rake 和所有rails 相关的命令在内部都是这样做的

ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"

这意味着如果你没有RAILS_ENVRACK_ENV环境,那么它将默认使用development环境。

Passenger 设置难道还不够吗?

没有。 Passenger 设置仅用于使您的应用程序启动/生活在渴望或虚拟环境中。它不会改变任何系统配置。

如果没有,我该如何解决它,这样我就不需要手动指定环境了?

这很容易。只需设置环境变量。如果您使用bash(通常人们会这样做),您可以简单地做到这一点

echo "export RAILS_ENV=production" >> ~/.bashrc ; source ~/.bashrc

这将使您的服务器成为rails production 服务器,因此如果您运行rails crake db:migrate 等或任何railsrake 命令,它将在production 服务器中运行所有可用的应用程序。

我在同一个盒子上运行应用程序的开发实例,在其相应的虚拟主机配置中将环境设置为开发。

这是个问题。如果你设置了上面的环境变量,那么每当你在这个应用程序中运行任何像rake db:migrate 这样的代码时,它将在production 环境中运行。为避免这种情况,您要么不设置环境变量,要么在每个命令上指定环境。有一个 hack 可用。在config/boot.rb 的顶部包含这一行

  ENV["RACK_ENV"] = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"

未来阅读:How can I make a custom environment in rails a default environment?

【讨论】:

    【解决方案2】:

    rake 完全不知道乘客的配置。它甚至不知道您正在使用乘客。由于它不是由乘客启动的,因此它必须(假设它知道您正在使用 apache/passenger)解析 apache 配置文件以找出这一点,这将变得非常复杂,尤其是在存在多个应用程序的情况下。

    您可以在 shell 的一个启动文件中设置它,但是如果您在同一台机器上有多个环境,这听起来不是一个好主意。

    你可以坚持

    ENV['RAILS_ENV']='production'
    

    在 Rails 的一个启动文件的顶部 - boot.rb 似乎可以解决问题。但是,这会使乘客的设置无效,显然您只想在脚本的生产部署中执行此操作。

    就个人而言(尤其是在具有多个运行环境的机器上)我会坚持输入 RAILS_ENV=production。

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 2010-09-09
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多