在我的虚拟主机中,我有:
<Directory /var/www/prod/myapp/myapp/public>
...
RailsEnv production
...
</Directory>
虽然依赖于production
的任何代码正在应用程序本身正常运行(例如:Rails.env.production?
时显示Google Analytics代码),当我从rake about
运行/var/www/prod/myapp/myapp
时{1}},我明白了:
Application root /var/www/prod/myapp/myapp
Environment development
Database adapter mysql2
这意味着我必须使用RAILS_ENV=production
为任何与部署相关的rake内容添加前缀。当然,这一切都在部署脚本中,所以它并不重要,但为什么Rake不知道它是生产?乘客设置不应该足够吗?如果没有,我该如何解决它,所以我不需要手动指定环境?
旁注:我在同一个盒子上运行应用程序的开发实例,并将Environment设置为相应vhost配置中的开发。
编辑:Phusion Passenger版本4.0.20
答案 0 :(得分:1)
你可以在你的一个shell的启动文件中设置它,但是如果你在同一台机器上有多个环境,这听起来不是一个好主意。
你可以坚持
ENV['RAILS_ENV']='production'
在Rails&#39;之一的顶部启动文件 - boot.rb似乎可以解决问题。这会使乘客的设置无效,显然你只想在脚本的生产部署中这样做。
就个人而言(特别是在运行多个环境的机器上)我坚持输入RAILS_ENV =生产。
答案 1 :(得分:0)
但为什么Rake不知道它的生产?
因为rake
和所有rails
相关命令在内部执行此操作
ENV['RAILS_ENV'] || ENV['RACK_ENV'] || "development"
这意味着如果您没有RAILS_ENV
或RACK_ENV
环境,那么默认情况下它将使用development
环境。
乘客设置不足以满足要求吗?
NO。 Passenger
设置仅用于使您的应用程序在欲望或虚拟环境中生效/生活。它不会改变任何系统配置。
如果没有,我该如何修复它以便我不需要手动指定环境?
这很容易。只需设置环境变量。如果您使用bash
(通常是人们),您可以简单地执行此操作
echo "export RAILS_ENV=production" >> ~/.bashrc ; source ~/.bashrc
这会使您的服务器成为rails production
服务器,因此如果您运行rails c
或rake db:migrate
等或任何rails
或rake
命令,它将会运行所有可用应用程序的production
服务器。
我在同一个盒子上运行app的开发实例,在相应的vhost配置中将Environment设置为development。
这是一个问题。如果您设置了上述环境变量,那么每当您在此应用程序中运行rake db:migrate
之类的任何代码时,这将在production
环境中运行。为避免这种情况,您不要在每个命令上设置环境变量或指定环境。有一个黑客可用。在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?