我一直在编写Rails应用程序已经很久了,我突然想到了Rails:环境下免费获得的东西。
也就是说,您可以在本地运行Rails应用程序,默认情况下,RAILS_ENV(或Rails.env)是" development"。如果您正在运行您的规格/测试,它会测试""测试"当您部署到生产服务器时,将其设置为" production&#34 ;.
当您有配置文件时,这尤其有用。对于Gemfile来说也可用于区分某些环境中的gem。
现在我的问题是:我正在编写一个纯Ruby应用程序而且我不知道设置它的最佳方式,这样我仍然可以拥有多个环境?我想为第三方服务(如MongoLab / Iron.IO /等)设置配置文件,但我希望它们设置为"开发","测试",&# 34;生产"等等然后我希望能够从各种环境中运行应用程序。
我知道我可以通过命令行环境变量手动处理它,但我想知道是否有最佳(更好?)的做法?有没有帮助这个的宝石?或者有关如何为纯Ruby应用程序构建环境处理的任何建议?
谢谢,
答案 0 :(得分:2)
你可以做类似于rails的方式:
class AppEnvironment
def initialize(env = :production)
@name = env.intern
end
def development?
@name == :development
end
def test?
@name == :test
end
def production?
@name == :production
end
end
app_environment = AppEnvironment.new( ENV['APP_ENVIRONMENT'] )
然后通过rake任务设置环境var。
namespace :myapp do
desc "Run a development server"
task :server => :environment do
ENV['APP_ENVIRONMENT'] ||= "development"
# ...
end
desc "Run a bunch of tests"
task :test => :environment do
ENV['APP_ENVIRONMENT'] ||= "test"
# alternatively do this in `spec_helper.rb`
end
end
使用Bundler,每个环境使用不同的宝石组非常容易。
您可能会在导轨中的config/application.rb
识别此行:
Bundler.require(:default, Rails.env) # Rails.env is just a string
除了在组外宣布的宝石外,它还告诉捆绑器require all gems in a specific group。
gem 'foo'
group :test do
gem 'rspec'
end
答案 1 :(得分:0)
使用ENV['RACK_ENV']
。 RAILS_ENV
实际上只是它的副本。
使用其他ENV来管理您的依赖项。例如,凭证和配置可以存储在ENV中。
有些ENV通常存储在配置文件中,如database.yml
或mongoid.yml
。
您可以使用dotenv gem来管理您的本地ENV。但是,我更喜欢使用Ruby或shell脚本来设置ENV和/或在开发环境中启动服务器:
local_setup.rb:
ENV[ 'RACK_ENV' ] = 'development'
或
rackup_local.sh:
RACK_ENV=development rackup
您可以为测试配置使用类似的脚本,并在规范帮助程序中要求它。我更喜欢将配置添加到规范助手的顶部。
如果你在你的环境脚本中放置了秘密,请确保Git忽略它并且不要将它添加到你的仓库。
关于Gemfile,除非有充分的理由这样做,否则不同的宝石用于不同的环境并不是一个好主意。测试,调试和缓存是在Gemfile中的环境组中的好例子。
答案 2 :(得分:0)
如果您只是在谈论配置文件,您可以使用看起来像铁路database.yml
文件的设置,将其读入并选择"右键"一组变量。
至少还有one gem来处理这样的"多层次"配置文件。