В итоге я вообще отказался от этого подхода в пользу загрузки конфигурации моего приложения из файла app_config.yml.Райан Бейтс описывает этот подход в Railscast # 226 .
. Единственное, что я сделал по-другому, - это загрузил общий app_config.yml для каждого сервера, который я использую.Поскольку я использую capistrano, я просто символическую ссылку на файл при развертывании.
Например, на staging2 мой shared/configs/app_config.yml
выглядит так:
staging:
host: "staging2.example.com"
... тогда как на staging3 этовыглядит так:
staging:
host: "staging3.example.com"
Теперь у моего application.rb
есть эта строка:
config.action_mailer.default_url_options = { host: APP_CONFIG[:host] }
Я удалил фактический config/app_config.yml
из git, чтобы он не включался в развертывание.(Я переместил его в config/app_config.yml.template
.) Затем при развертывании я использую задачу capistrano для символической ссылки shared/configs/app_config.yml
на config/app_config.yml
:
namespace :deploy do
desc "Symlinks the app_config.yml"
task :symlink_app_config, :roles => [:web, :app, :db] do
run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml"
end
end
Эта стратегия имеет следующие преимущества по сравнению с использованием ENV vars:
- Развертывание на всех узлах через capistrano
- Мы можем сделать условные хосты, просто изменив файл на соответствующем сервере
- Unicorn получит изменения с USR2, так как все делается внутри rails
- Все хранится в одном месте, и на окружение не влияют некоторые другие переменные за пределами кодовой базы