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.yml
或 mongoid.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" 配置文件。
我已经编写 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.yml
或 mongoid.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" 配置文件。