#ruby-on-rails-3 #rubygems #bundler
#ruby-on-rails-3 #rubygems #bundler
Вопрос:
Наше приложение Rails извлекает каналы из нескольких источников. Работникам, которые извлекают эти каналы, нужны зависимости gem для rmagick, баз данных oracle и многих других gems. Короче говоря, у них совсем другие потребности в зависимостях, чем у основного веб-приложения. До Rails 3 и Bundler жизнь была хорошей.
Эти зависимости рабочего gem не имеют отношения к нашему реальному производственному веб-сайту. Ожидается, что в Rails 3 один Gemfile будет содержать все эти зависимости. Это имеет неприятный побочный эффект, заключающийся в том, что требуется загружать все зависимости gem в производственном приложении, что приведет к бессмысленному раздуванию, возможным проблемам безопасности, утечкам памяти, усложнению развертывания и другим неприятностям. К сожалению, Bundler нарушает стандартный механизм require, который обеспечил бы выход из трясины, позволяя нам просто запрашивать необходимые gem только в worker и располагать их где-нибудь в системе, а не в bundle. Рабочие используют наши модели rails для хранения своих данных.
Кто-нибудь может предложить решения, позволяющие сделать систему практичной в Rails 3? У меня возникает соблазн заставить Gemfile использовать условные переменные среды местами для управления командами gem, однако, похоже, что Gemfile.блокировка может сделать проблематичным переход от работы с одним рабочим скриптом (для каналов) к следующему, который будет иметь разные зависимости. Помогите???
Ответ №1:
Я обдумывал похожую проблему, и хотя у меня пока нигде не используется решение, ваш вопрос заставил меня еще немного подумать. Я думаю, вы должны иметь возможность использовать группу для выполнения этого. Вы можете добавить что-то подобное в свой Gemfile:
group :workers do
gem "extra_gem_1"
gem "extra_gem_2"
end
Затем вы можете вызвать
Bundler.require(:default, :workers)
и это должно загрузить ваши драгоценные камни. Как это работает, будет зависеть от ваших настроек, возможно, вы сможете добавить логику в config/application.rb
, или вам может потребоваться сделать это в другом месте. Это может показаться халтурным, но в консоли это работает в любом случае.
При установке ваших gems вы можете вызвать:
bundle install --without workers
чтобы исключить эти драгоценные камни из производства.
В качестве альтернативы вы можете использовать два Gemfile, но это также кажется беспорядком, поскольку, предположительно, происходит некоторое пересечение.