我正在尝试将相同的rails应用程序部署到具有不同应用程序名称,不同徽标,不同样式表等的两个不同位置。
我根据APP_NAME和我存储在environment / production.rb中的HOST_NAME变量获得了代码。现在我需要实际部署它,我需要一个比手动编辑生产机器上的环境文件更好的解决方案。
我能看到的唯一方法是创建一个新的生产环境 - 例如production_app2 - 并在其中定义APP_NAME和HOST_NAME。还有更好的方法吗?
答案 0 :(得分:6)
不不不!不要编辑环境文件。我的意思是,根据需要编辑它们,以便为每个部署配置相同的,但不能在部署之间配置。
为此,请使用配置。
在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
答案 1 :(得分:1)
我认为这是一个非常好的方式。
我们在哪里定义不同的环境(例如'staging','production','production_backup' - 为我们提供staging.rb
,production.rb
,production_backup.rb
,您可以在其中定义具体的APP_NAMEs
和HOST_NAMEs
)并可以使用Capistrano部署到每个人。它运作得很好。
这是一个很好的链接:http://www.egtheblog.com/?p=8
答案 2 :(得分:1)
因为您实际上正在部署到两个不同的环境,所以最好创建两个不同的环境文件,每个文件都有自己的设置。确保为环境文件选择描述性名称,而不仅仅是production2
。
您也可以将此信息存储在数据库中,但我不知道您是否愿意接受这种依赖。我想使用数据库只有在部署数量太大而无法使用少量环境文件轻松管理时才有意义。