Как справиться с различными зависимостями гемов в Bundler для скриптов в рамках одного проекта Rails?

Наше приложение Rails получает каналы из нескольких источников. Рабочим, которые загружают эти каналы, нужны зависимости от гемов для rmagick, баз данных oracle и многих других драгоценных камней. Короче говоря, у них очень разные потребности в зависимости, чем у основного веб-приложения. До Rails 3 и Bundler жизнь была хорошей.

Эти зависимости гемов рабочих не имеют отношения к нашему фактическому производственному веб-сайту. В Rails 3 ожидается, что один Gemfile будет содержать все эти зависимости. Это имеет неприятный побочный эффект, заключающийся в необходимости загрузки всех зависимостей гемов в производственное приложение, что может вызвать бессмысленное раздувание, возможные проблемы с безопасностью, утечки памяти, усложнение развертывания и другие проблемы. К сожалению, Bundler нарушает стандартный механизм require, который обеспечил бы выход из трясины, позволив нам просто запрашивать необходимые драгоценные камни только в рабочем и иметь их где-нибудь в системе, а не в комплекте. Рабочие используют наши модели рельсов для хранения своих данных.

Может ли кто-нибудь предложить решения, позволяющие сделать систему практичной в Rails 3? У меня есть соблазн заставить Gemfile использовать условные переменные среды в местах для управления командами gem, однако кажется, что Gemfile.lock может сделать этот проблемный переход от работы с одним рабочим скриптом (для каналов) к следующему, что привело бы к разные зависимости. Помощь???


person ebeland    schedule 10.06.2011    source источник


Ответы (1)


Я размышлял над подобной проблемой, и, хотя у меня еще нет решения, используемого нигде, ваш вопрос заставил меня задуматься еще немного. Я думаю, у вас должна быть возможность использовать группу для этого. Вы можете добавить в свой Gemfile что-то вроде этого:

group :workers do
  gem "extra_gem_1"
  gem "extra_gem_2"
end

Тогда вы можете позвонить

Bundler.require(:default, :workers)

и это должно загрузить ваши драгоценные камни. Как это работает, будет зависеть от ваших настроек, вы можете добавить логику в config/application.rb или вам может потребоваться сделать это где-нибудь в другом месте. Это может показаться хакерским, но в консоли все равно работает.

Устанавливая свои драгоценные камни, вы можете позвонить:

bundle install --without workers

чтобы исключить эти драгоценные камни из производства.

В качестве альтернативы вы можете использовать два Gemfile, но это тоже похоже на беспорядок, поскольку, по-видимому, есть какой-то кроссовер.

person muffinista    schedule 10.06.2011