Ruby 应用程序的多个环境

Multiple environments for Ruby application

我已经编写 Rails 应用程序太久了,以至于我突然陷入了使用 Rails: 环境免费获得的东西。

也就是说,您可以在本地运行 Rails 应用程序,默认情况下,RAILS_ENV(或Rails.env)是"development"。如果你 运行 宁你的 specs/tests,它是 "test" 并且当你部署到你的生产服务器时,你将它设置为 运行 作为 "production".

这在您有配置文件时特别有用。也可用于 Gemfile 区分特定环境的宝石。

现在回答我的问题:我正在编写一个纯粹的 Ruby 应用程序,但我不知道设置它以便我仍然可以拥有多个环境的最佳方法?我想为第 3 方服务设置配置文件(如 MongoLab/Iron.IO/etc。)但我希望它们设置为 "development"、"test"、"production",等等。然后我希望能够 运行 来自各种环境的应用程序。

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

谢谢,

您可以像 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 任务设置环境变量。

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 可以很容易地为每个环境使用不同的 gem 集。

您可能会从 rails 中的 config/application.rb 中认出这一行:

Bundler.require(:default, Rails.env) # Rails.env is just a string

这告诉打包程序 require all gems in a specific group 除了在组外声明的 gem。

gem 'foo'

group :test do
  gem 'rspec'
end

使用ENV['RACK_ENV']RAILS_ENV 其实只是复制而已

使用其他 ENV 来管理您的依赖项。例如,凭据和配置可以存储在 ENV 中。

一些 ENV 通常存储在配置文件中,例如 database.ymlmongoid.yml

您可以使用 dotenv gem 来管理您的本地 ENV。但是,我更喜欢使用 Ruby 或 shell 脚本来设置 ENV 的 and/or 在开发环境中启动服务器:

local_setup.rb:

ENV[ 'RACK_ENV' ] = 'development'

rackup_local.sh:

RACK_ENV=development rackup

您可以为测试配置使用类似的脚本,并在规范帮助程序中要求它。我更喜欢将配置添加到规范助手的顶部。

如果您在 env 脚本中放入机密,请务必 Git 忽略它并且不要将其添加到您的存储库中。

关于 Gemfile,除非有充分的理由,否则对不同的环境使用不同的 gem 并不是一个好主意。测试、调试和缓存是位于 Gemfile 环境组中的好例子。

如果您只是在讨论配置文件,您可以使用类似于 Rail 的 database.yml 文件的设置,读取它并 select "right" 变量集。

至少还有 one gem 来处理这样的 "multi-level" 配置文件。