zai*_*ius 0 deployment ruby-on-rails release-management
我正在尝试将相同的rails应用程序部署到具有不同应用程序名称,不同徽标,不同样式表等的两个不同位置.
我根据APP_NAME和我存储在environment/production.rb中的HOST_NAME变量获得了代码.现在我需要实际部署它,我需要一个比手动编辑生产机器上的环境文件更好的解决方案.
我能看到的唯一方法是创建一个新的生产环境 - 例如production_app2 - 并在其中定义APP_NAME和HOST_NAME.有没有更好的办法?
不不不!不要编辑环境文件.我的意思是,根据需要编辑它们,以便为每个部署配置相同的内容,而不是在部署之间可配置的内容.
为此,请使用配置.
抛出一个YAML文件config,看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
把它称之为有意义.让我们说吧settings.yml.
现在使用初始化程序加载它,config/initializers/settings.rb如下所示:
SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")[RAILS_ENV]
Run Code Online (Sandbox Code Playgroud)
现在访问您的配置,如下所示:
SETTINGS[:app_name]
Run Code Online (Sandbox Code Playgroud)
(如果您根本不想更改现有代码,请在内部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
Run Code Online (Sandbox Code Playgroud)