Що означає "вимагає: помилка" у Gemfile?


429

Чи так:

gem 'whenever', require: false

означає, що дорогоцінний камінь потрібно встановити, чи це означає, що він не потрібен?


1
Більшість відповідей (включаючи прийняті) стосуються Rails, які роблять Bundler.requireза замовчуванням, як я розумію. Правильні лише відповіді Кіро та Неші.
Накілон

Відповіді:


472

Це означає встановити дорогоцінний камінь, але не вимагайте дзвінків, коли ви запускаєте Bundler. Тож вам потрібно буде дзвонити вручну

require "whenever"

якщо ви хочете використовувати бібліотеку.

Якби ти робив

gem "whenever", require: "whereever"

тоді bundler завантажуватиме дорогоцінний камінь, назване коли завгодно, але дзвонить

require "whereever"

Це часто використовується, якщо ім’я потрібної бібліотеки відрізняється від назви дорогоцінного каміння.


112
@VenkatD. іноді ви хочете встановити певні дорогоцінні камені, але ви не хочете завантажувати їх у кожен процес. У мене є конкретне завдання граблі, яке я хочу періодично викликати на Heroku через їх додаток до розкладу. Для цього конкретного завдання граблі потрібні певні дорогоцінні камені, які не потрібні решті додатків. Тому я :require => falseці конкретні дорогоцінні камені і явно require "thegem"з граблі завдання. Це дозволить заощадити пам’ять у основних процесах програми та час запуску тощо. На продуктивність додатків, однак, це не повинно впливати, навіть якщо вам потрібні ці додаткові дорогоцінні камені в кожному процесі.
Майкл van Rooijen

5
@MichaelvanRooijen - чудові моменти, однак: "Однак на продуктивність додатків не слід впливати, навіть якщо вам потрібні ці додаткові дорогоцінні камені в кожному процесі". Я не думаю, що це правда. Виділення об'єктів вимагає роботи, і GC повинен кожного разу пробігати їх, тому більше = повільніше, згідно з confreaks.com/videos/2668-gogaruco2013-measuring-ruby
Натан Лонг

1
@MichaelvanRooijen - На практиці ви праві, це, як правило, не має значення, якщо ви не користуєтеся бібліотекою. Але вимагаючи дорогоцінного каміння, принаймні завантажуватиме його основний файл у lib, і, ймовірно, він потребує більше власного. Навіть якщо ви require 'yaml', у вас зараз YAMLмодуль є об'єктом у пам'яті.
Натан Лонг

2
Що робити, якщо ви хочете встановити на false, а ім’я бібліотеки також відрізняється від імені дорогоцінного каміння?
Пітер-Ян Селіс

2
@ Peter-JanCelis У такому випадку ви просто встановите, :require => falseа потім у своєму коді матиметеrequire 'library_name_here'
Роб Ді Марко

73

Ви використовуєте, :require => falseколи хочете, щоб дорогоцінний камінь був встановлений, але не "потрібен".

Так у прикладі, який ви подали: gem 'whenever', :require => false коли хтось запускає пакет, встановлюйте щоразу, коли дорогоцінний камінь буде встановлений, як з gem install whenever. Кожен раз, коли використовується для створення завдань cron, виконуючи завдання граблі, але, як правило, не використовується з-за додатків рейки (або іншого, якщо не рейки).

Таким чином, ви можете використовувати :require => falseвсе, що вам потрібно запустити з командного рядка, але не потрібно в коді.


6
Це також може бути використане для дорогоцінного каміння, який ви використовуєте лише у невеликій підмножині запитів.
Натан Лонг

61

require: falseвказує Bundler.requireне вимагати конкретного дорогоцінного каміння: дорогоцінний камінь потрібно вимагати явно через require 'gem'.

Цей параметр не впливає на:

  • bundle install: дорогоцінний камінь буде встановлений незалежно

  • requireустановка шляху пошуку по Bundler.

    Bundler додає речі на шлях, коли ви робите будь-яке з:

    • Bundle.setup
    • який називається require bundler/setup
    • який називається bundle exec

Приклад

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.rb

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

Тоді наведені нижче ставки не створюватимуть винятків:

bundle install --path=.bundle
bundle exec ruby main.rb

На GitHub вам пограти.

Використання рейок

Як пояснено в посібнику з ініціалізацією , шаблон запуску за замовчуванням працює при запуску:

  • config/boot.rb
  • config/application.rb

config/boot.rb містить:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

який робить require 'bundler/setup'і встановлює потрібний шлях.

config/application.rb робить:

Bundler.require(:default, Rails.env)

що насправді вимагає дорогоцінних каменів.


Зауважте, що при використанні require 'fakerможливо не використовувати правильну версію дорогоцінного каменю, особливо якщо ви Gemfile вказуєте на git ref.
дазонік

@dazonic Чи відрізняється Хамль на прикладі?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

9

Кожного разу, коли ви вкажете Gem у вашому Gemfileзапуску та запустіть bundle install, bundler запустить і встановить вказаний дорогоцінний камінь та код завантаження для цього Gem у вашій програмі, поставивши require 'whenever'таким чином постачальник завантажуючи код для всіх ваших самоцвітів у вашому додатку Rails, і ви можете зателефонувати будь-яким методом з будь-якого Самоцвіту без будь-якого болю, як ви робите більшу частину часу.

але дорогоцінні камені - whenever, faker or capistrano це те, що вам не потрібно в коді додатка, який вам потрібно, коли код у вашому schedule.rb файлі керує коронками та кодом capistrano у deploy.rb файлі, щоб налаштувати рецепт розгортання, тому вам не потрібно завантажувати код для цих дорогоцінних каменів у код програми та де б ви не знаходилися Хочете зателефонувати з будь-якого методу з цих дорогоцінних каменів, ви можете вручну зажадати самих цих дорогоцінних каменів, поставивши require "whenever" . Таким чином, ви :require => falseвкладете у свій Gemfile для цих дорогоцінних каменів, таким чином постачальник встановить цей Gem, але не завантажить код для цього самого Gem, ви можете це робити коли завгодно, просто поставивши у своєму випадку так, як вимагають "коли".


2

Для того, щоб вимагати дорогоцінні камені у вашому Gemfile, вам потрібно буде зателефонувати Bundler.require.

Ви можете не допустити, щоб постачальник вимагав дорогоцінного каменя require: false, але він все одно буде встановлювати та підтримувати дорогоцінний камінь. Перевірте це для більш детального пояснення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.