将rails应用程序部署到多个位置

zai*_*ius 0 deployment ruby-on-rails release-management

我正在尝试将相同的rails应用程序部署到具有不同应用程序名称,不同徽标,不同样式表等的两个不同位置.

我根据APP_NAME和我存储在environment/production.rb中的HOST_NAME变量获得了代码.现在我需要实际部署它,我需要一个比手动编辑生产机器上的环境文件更好的解决方案.

我能看到的唯一方法是创建一个新的生产环境 - 例如production_app2 - 并在其中定义APP_NAME和HOST_NAME.有没有更好的办法?

Ian*_*ell 6

不不不!不要编辑环境文件.我的意思是,根据需要编辑它们,以便为每个部署配置相同的内容,而不是在部署之间配置的内容.

为此,请使用配置.

抛出一个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的部署,这是我用来currentshared目录中对新的多个配置文件进行符号链接(我认为它最初来自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)