Комплект рейок встановлює лише виробництво


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 встановлює всі дорогоцінні камені, і ваша програма використовує ті дорогоцінні камені, які йому потрібні. Сам Бандлер нічого не знає про Rails та поточне середовище.


3
Я знаю про це --without, але це виглядає дуже елегантно, особливо враховуючи ті директиви конфігурації в config/application.rb(які мають стосуватися саме цього), а також враховуючи цю цитату: Rails 3 постачається із запеченим на підтримку з пакетом.
gingerlime

2
Команда встановлення пакета повністю незалежна від Rails. Він просто заглядає у ваш Gemfile, йому байдуже, які бібліотеки вашій програмі насправді потрібні у згаданому конфігурі. Насправді ви можете пропустити Bundler.require і вимагати libs вручну від будь-якої групи. Я погоджуюсь, що Rails міг би краще інтегруватися в цьому випадку з Bundler, але це не так.
Симон Перепелиця

2
Розумію. Отже, я вважаю справедливим сказати, що rails знає про пакет (тобто config/application.rbтакож config/boot.rb, а також ), але пакувальник нічого не знає про rails ... Він лише читає Gemfile і не використовує жоден з цих файлів rails. Думаю, монета нарешті впала. Спасибі за вашу допомогу!
gingerlime

насправді це здається елегантним, оскільки виключає "групи" у вашому Gemfile, а не середовища у вашому додатку Rails. Я знаю, що це було сказано, але коли я подумав про це так, це мало для мене більше сенсу.
jaydel

1
Не впевнений, чи це щось змінилося за останні чотири роки, але аргументи для, --withoutяк передбачається, слід розділяти :s, а не пробілами. Тож я вважаю, що так повинно бути bundle install --without development:test.
Джо Фріман,

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.