我正在尝试将相同的 rails 应用程序部署到具有不同应用程序名称、不同徽标、不同样式表等的两个不同位置。
我的代码基于我存储在环境/production.rb 中的 APP_NAME 和 HOST_NAME 变量工作。现在我需要实际部署它,我需要一个比在生产机器上手动编辑环境文件更好的解决方案。
我能看到的唯一方法是创建一个新的生产环境 - 例如 production_app2 - 并在其中以不同的方式定义 APP_NAME 和 HOST_NAME。有没有更好的办法?
我正在尝试将相同的 rails 应用程序部署到具有不同应用程序名称、不同徽标、不同样式表等的两个不同位置。
我的代码基于我存储在环境/production.rb 中的 APP_NAME 和 HOST_NAME 变量工作。现在我需要实际部署它,我需要一个比在生产机器上手动编辑环境文件更好的解决方案。
我能看到的唯一方法是创建一个新的生产环境 - 例如 production_app2 - 并在其中以不同的方式定义 APP_NAME 和 HOST_NAME。有没有更好的办法?
不不不!不要编辑环境文件。我的意思是,根据需要编辑它们,以便为每个部署都配置相同的内容,但不适用于应该在部署之间配置的内容。
为此,请使用配置。
config
抛出一个看起来像这样的 YAML 文件:
development:
:app_name: App 1
:host_name: something.com
test:
:app_name: App 1
:host_name: something.com
production:
:app_name: App 1
:host_name: something.com
称它为任何有意义的东西。比方说settings.yml
。
现在使用如下所示的初始化程序加载它config/initializers/settings.rb
:
SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")[RAILS_ENV]
现在像这样访问您的配置:
SETTINGS[:app_name]
(如果您根本不想更改现有代码,请在里面config/initializers/settings.rb
添加设置现有名称的行,例如APP_NAME = SETTINGS[:app_name]
等)
请注意,这是设置配置的一种可能实现,但即使采用另一种方法,它也应该基于独立于部署的配置。这可以比使用环境文件更容易和可维护地设置为在部署和升级之间持续存在。
再次回顾一下:
更新
对于基于 Capistrano 的部署,这是我用来符号链接目录中新current
的多个配置文件的shared
方法(我认为它最初来自 EngineYard 的 Ezra 配方):
after "deploy:update_code","deploy:symlink_configs"
namespace(:deploy) do
task :symlink_configs, :roles => :app, :except => {:no_symlink => true} do
configs = %w{ database settings }
configs.map! { |file| "ln -nfs #{shared_path}/config/#{file}.yml #{release_path}/config/#{file}.yml" }
run <<-CMD
cd #{release_path} && #{configs.join(' && ')}
CMD
end
end
我认为这是一个非常好的方法。
我们在哪里定义不同的环境(例如,'staging'、'production'、'production_backup' - 给我们一个staging.rb
, production.rb
,production_backup.rb
您可以在其中定义您的特定APP_NAMEs
和HOST_NAMEs
)并且可以使用 Capistrano 部署到每个环境。它工作得很好。
这是一个很好的链接:http ://www.egtheblog.com/?p=8
因为您实际上是部署到两个不同的环境,所以最好创建两个不同的环境文件,每个文件都有自己的设置。确保为环境文件选择描述性名称,而不仅仅是production2
.
您也可以将此信息存储在数据库中,但我不知道您是否愿意接受这样的依赖。我想只有在部署数量太大而无法使用几个环境文件轻松管理的情况下,使用数据库才有意义。