Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rake未使用与phusion乘客设置相同的环境值_Ruby On Rails_Environment Variables_Passenger - Fatal编程技术网

Ruby on rails Rake未使用与phusion乘客设置相同的环境值

Ruby on rails Rake未使用与phusion乘客设置相同的环境值,ruby-on-rails,environment-variables,passenger,Ruby On Rails,Environment Variables,Passenger,在我的vhost中,我有: <Directory /var/www/prod/myapp/myapp/public> ... RailsEnv production ... </Directory> 这意味着我必须用RAILS\u ENV=production作为任何与部署相关的rake内容的前缀。诚然,在这一点上,这一切都在一个部署脚本中,所以这并不重要,但为什么Rake没有意识到这是生产呢?乘客设置是否足够?如果没有,我如何修复它,使我不需要手动指定环境

在我的vhost中,我有:

<Directory /var/www/prod/myapp/myapp/public>
  ...
  RailsEnv production
  ...
</Directory>
这意味着我必须用
RAILS\u ENV=production
作为任何与部署相关的rake内容的前缀。诚然,在这一点上,这一切都在一个部署脚本中,所以这并不重要,但为什么Rake没有意识到这是生产呢?乘客设置是否足够?如果没有,我如何修复它,使我不需要手动指定环境

旁注:我在同一个框中运行应用程序的开发实例,环境在其相应的vhost配置中设置为development


编辑:Phusion乘客版4.0.20

rake完全不知道乘客的配置。它甚至不知道你在用乘客。由于它不是由passenger启动的,因此它必须(假设它知道您使用的是apache/passenger)解析apache配置文件才能找到答案,这将变得相当复杂,尤其是在存在多个应用程序的情况下

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

你可以坚持下去

ENV['RAILS_ENV']='production'
在Rails的一个启动文件的顶部,boot.rb似乎起到了作用。但这会使passenger的设置无效,显然,您只希望在脚本的生产部署中执行此操作

就我个人而言(特别是在一台运行着多个环境的机器上),我会坚持键入RAILS\u ENV=production

但为什么Rake不知道这是生产

因为
rake
和所有
rails
相关命令都在内部执行此操作

ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"
这意味着,如果您没有
RAILS\u ENV
RACK\u ENV
环境,那么默认情况下,它将使用
development
环境

乘客设置是否足够

不。
Passenger
设置仅用于制作您的应用程序/生活在渴望中,或者说是虚拟环境。它不会改变任何系统配置

如果没有,我如何修复它,使我不需要手动指定环境

那很容易。只需设置环境变量。如果您使用的是
bash
(通常人们会这样做),您可以简单地执行此操作

echo "export RAILS_ENV=production" >> ~/.bashrc ; source ~/.bashrc
这将使您的服务器成为
rails production
server,因此,如果您运行
rails c
rake db:migrate
etc或任何
rails
rake
命令,它将在
production
服务器中为所有可用的应用程序运行

我在同一个框中运行应用程序的开发实例,环境在其相应的vhost配置中设置为development

这是一个问题。如果您设置了上述环境变量,则每当您在此应用程序内运行任何代码(如
rake db:migrate
)时,都将在
production
环境中运行。若要避免这种情况,请不要在每个命令上设置环境变量或指定环境。有一个黑客可用。在config/boot.rb的顶部包括这一行

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

未来阅读:

你在使用Capistrano吗?rvm?两者都有?rvm,是的,Capistrano,不是。也许问题来自你的部署。你用什么?重读我贴的。我的部署脚本没有任何问题,因为它显式地为命令指定了RAILS_ENV变量。问题是在给定配置的rake级别上,这是否必要。
  ENV["RACK_ENV"] = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"