2009-05-29 3 views
0

Я пытаюсь развернуть приложение же рельсы на два разных места с разными названиями приложений, различными логотипами, различными стилями и т.д.Развертывание приложения рельсов в нескольких местах

Я получил код контракта на основе APP_NAME и переменную HOST_NAME, которую я храню в средах/production.rb. Теперь мне нужно его развернуть, и мне нужно лучшее решение, чем ручное редактирование файла окружения на производственной машине.

Единственный способ, которым я могу это сделать, - создать новую производственную среду - например. production_app2 - и определите в них APP_NAME и HOST_NAME. Есть ли способ лучше?

ответ

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 

Называйте это как имеет смысл. Скажем 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] и т. д.)

Обратите внимание, что это один из возможных вариантов привязка настроек настроек, но даже если принять другой подход, он должен основываться на конфигурации, не зависящей от развертывания. Это может быть намного проще и сдержанно настроено для сохранения между развертываниями и обновлениями, чем удаление файлов окружения.

Снова повторит:

  • среда файлов для конфигурации, которая одинакова для всех внедрений
  • конфигурационных файлов для конфигурации, которые могут меняться между внедрениями

Update

Для развертываний на базе Capistrano это то, что я использую для symlink multi PLE файлы конфигурации в новом current из каталога shared (я думаю, что изначально пришли из рецепта Эзры из EngineYard):

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 
+0

Имеет смысл. Но как мне получить разные файлы настроек для каждого развертывания? – zaius

+1

Предположительно, у них тоже разные базы данных. Вы используете ту же стратегию, которую используете для предоставления им различных файлов config/database.yml. При развертывании на основе Capistrano это обычно означает символическую привязку к файлам в общей папке. –

+0

Aha! Это то, что я искал. Таким образом, каждое место развертывания будет иметь свои собственные файлы настроек, и я использую свой инструмент развертывания для симпликации. Отлично, спасибо! – zaius

1

Я думаю, что это очень хороший способ.

Где мы определим различные среды (например, «поэтапности», «производство», «production_backup» - дает нам staging.rb, production.rb, production_backup.rb, где вы можете определить конкретные APP_NAMEs и HOST_NAMEs) и развернуть к каждому из них используя Capistrano. Он работает отлично.

Это хорошая ссылка на него: http://www.egtheblog.com/?p=8

1

Потому что вы на самом деле развертывания в двух различных средах, кажется, лучше всего создать две разные файлы среды, каждый со своими собственными настройками. Убедитесь, что вы выбрали описательные имена для файлов среды, а не только production2.

Вы также можете сохранить эту информацию в базе данных, но я не знаю, согласны ли вы принять такую ​​зависимость. Думаю, использование базы данных будет иметь смысл только в том случае, если количество развертываний слишком велико, чтобы легко управлять несколькими файлами среды.