Ruby应用程序的多个环境

时间:2015-04-28 16:13:35

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

我一直在编写Rails应用程序已经很久了,我突然想到了Rails:环境下免费获得的东西。

也就是说,您可以在本地运行Rails应用程序,默认情况下,RAILS_ENV(或Rails.env)是" development"。如果您正在运行您的规格/测试,它会测试""测试"当您部署到生产服务器时,将其设置为" production&#34 ;.

当您有配置文件时,这尤其有用。对于Gemfile来说也可用于区分某些环境中的gem。

现在我的问题是:我正在编写一个纯Ruby应用程序而且我不知道设置它的最佳方式,这样我仍然可以拥有多个环境?我想为第三方服务(如MongoLab / Iron.IO /等)设置配置文件,但我希望它们设置为"开发","测试",&# 34;生产"等等然后我希望能够从各种环境中运行应用程序。

我知道我可以通过命令行环境变量手动处理它,但我想知道是否有最佳(更好?)的做法?有没有帮助这个的宝石?或者有关如何为纯Ruby应用程序构建环境处理的任何建议?

谢谢,

3 个答案:

答案 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.ymlmongoid.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来处理这样的"多层次"配置文件。