2014-12-23 3 views
3

У меня есть приложение Rails, которое содержит много кода и зависимостей. Он имеет компонент веб-сервера, рабочий компонент (на основе Sidekiq) и компонент базы данных.Rails 3.2: Gem зависимостей только для работника Sidekiq

У меня есть некоторые драгоценные камни, которые должны быть у рабочих, но они мне не нужны на веб-серверах. Я также не хочу, чтобы мой контроллер или код просмотра загружался в рабочий стол Sidekiq.

Есть ли способ рассказать Bundler (через Gemfile, я полагаю) включать только определенные камни или классы в рабочих, но не на веб-сервере?

ответ

2

Если добавить это к вам Gemfile:

gem 'mygem', require: false 

Вы можете условно требовать mygem в ваших инициализаторах на основе среды.

4

Чистейший решение создать группу, уборщица в вашем Gemfile:

group :worker do 
    # These gems are only needed by the workers 
    gem 'foo' 
    gem 'bar' 
end 

Эти драгоценные камни не будут загружаться по умолчанию.

Тогда при инициализации ваших работников называют Bundler.require(:worker)

EDIT (в ответ на ваш комментарий):

Два совершенно приемлемые варианты здесь,

а) Не загружайте среды рельсов в ваших работниках.

Я считаю, что правильный путь для этого заключается в вызове sidekiq с sidekiq -r worker_environment.rb где worker_environment.rb требует ваших зависимостей и ваших рабочих файлов.

b) Настройте среду рельсов, чтобы не загружать группу gem по умолчанию для ваших рабочих процессов.

Я не уверен с Rails 3.2, но в Rails 4.x вы найдете строку в своем config/application.rb Bundler.require(*Rails.groups). Rails.groups обычно будут чем-то вроде [:default, :development] или [:default, :production]. Таким образом, вы можете добавить некоторую логику, чтобы вместо этого требовать только :worker, если вы находитесь в рабочем процессе (возможно, вы можете установить env var только для своих рабочих процессов, чтобы отличить здесь).

+1

Мне нравится этот ответ, но ... Bundler уже приносит мои драгоценные камни (я полагаю). Где это делается, чтобы я мог прокомментировать это и позвонить Bundler.require (: worker)? Кроме того, должен ли я выполнять этот звонок у каждого работника или есть какое-то общее место для этого? –

+0

А я не слишком внимательно прочитал ваш вопрос, извините. Я сделаю некоторые изменения ... –

Смежные вопросы