Пакет Rails устанавливает только производство


87

Я все еще новичок в rails / ruby ​​/ bundler и немного запутался.

В нашем config/application.rbфайле есть сегмент бандлера:

if defined?(Bundler)         
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

а в нашем Gemfileмы используем разные группы, например

group :development, :test do
  gem "rspec-rails", ">= 2.7.0", :group => [:development, :test]
  gem 'shoulda-matchers'
  gem 'watchr'
  gem 'spork', '~> 1.0rc'
  gem 'spectator'                          
  gem 'debugger'
  gem 'wirble'
end

Но когда я запускаю RAILS_ENV=production bundle install(или bundle install --deployment), он все равно устанавливает драгоценные камни из группы разработки / тестирования ...

Почему это происходит или как я могу заставить это работать правильно?

Ответы:


182

Взгляните на --withoutвариант:

bundle install --without development test

По умолчанию Bundler устанавливает все драгоценные камни, а ваше приложение использует необходимые драгоценные камни. Сам Bundler ничего не знает о Rails и текущем окружении.


3
Я знаю об этом --without, но это кажется очень не элегантным, особенно учитывая те директивы конфигурации в config/application.rb(которые, как предполагается, обращаются именно к этому), а также с учетом этой цитаты: Rails 3 поставляется с встроенной поддержкой с Bundler.
Gingerlime 06

2
Команда установки пакета полностью независима от Rails. Он просто смотрит в ваш Gemfile, ему все равно, какие библиотеки на самом деле требуются вашему приложению в упомянутой конфигурации. Фактически, вы можете пропустить Bundler.require и потребовать библиотеки вручную из любой группы. Я согласен, что в этом случае Rails мог бы лучше интегрироваться с Bundler, но это не так.
Симон Перепелица

2
Понимаю. Так что я думаю, будет справедливо сказать, что rails знает о Bundler (т.е. in config/application.rbи also config/boot.rb), но Bundler ничего не знает о rails ... Он только читает Gemfile и не использует ни один из этих файлов rails. Думаю, монета наконец упала. Спасибо за вашу помощь!
Gingerlime

на самом деле это кажется элегантным, поскольку исключает «группы» в вашем Gemfile, а не среды в вашем приложении Rails. Я знаю, что это было сказано, но когда я подумал об этом так, это стало для меня более осмысленным.
jaydel

1
Не уверен, что это что-то изменилось за последние четыре года, но аргументы для --withoutдолжны быть разделены :s, а не пробелами. Я считаю, что так и должно быть bundle install --without development:test.
Joe Freeman

2

Альтернативное решение - использовать bundle-onlyдрагоценный камень рубин . Его можно использовать следующим образом:

> gem install bundle-only
> bundle-only production

Эта библиотека не загрязняет конфигурации и дополнения вашего сборщика Gemfile.lock; это простая альтернатива встроенной bundle --without every other groupопции bundler.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.