web-dev-qa-db-fra.com

Que veut dire 'require: false' dans Gemfile?

Est ce que ca:

gem 'whenever', require: false

signifie que la gemme doit être installée, ou est-ce que cela signifie qu'elle n'est pas requise?

403
rafamvc

Cela signifie installer la gemme, mais ne pas appeler au besoin lorsque vous démarrez Bundler. Vous devrez donc appeler manuellement

require "whenever"

si vous voulez utiliser la bibliothèque.

Si tu devais faire

gem "whenever", require: "whereever"

alors le bundler téléchargerait la gemme nommée à tout moment, mais appellerait

require "whereever"

Ceci est souvent utilisé si le nom de la bibliothèque à exiger est différent du nom de la gemme.

452
Rob Di Marco

Vous utilisez :require => false lorsque vous souhaitez que la gem soit installée mais non "obligatoire".

Ainsi, dans l'exemple que vous avez donné: gem 'whenever', :require => false lorsque quelqu'un exécute une installation groupée, installez-la à chaque fois que gem sera installé comme avec gem install whenever. Chaque fois que vous utilisez pour créer des tâches cron en exécutant une tâche rake, mais que vous ne l'utilisez généralement pas dans l'application Rails (ou dans un autre framework, si ce n'est Rails).

Vous pouvez donc utiliser :require => false pour tout ce que vous devez exécuter à partir de la ligne de commande mais dont vous n'avez pas besoin dans votre code.

70
gduq

require: false indique à Bundler.require de ne pas exiger cette gemme spécifique: la gemme doit être demandée explicitement via require 'gem'.

Cette option n'affecte pas:

  • bundle install: la gemme sera installée malgré tout

  • le chemin de recherche require est configuré par le bundler.

    Bundler ajoute des éléments au chemin lorsque vous effectuez l'une des opérations suivantes:

    • Bundle.setup
    • qui s'appelle par require bundler/setup
    • qui s'appelle par bundle exec

Exemple

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

Ensuite, les éléments suivants ne déclencheront pas d'exceptions:

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

Sur GitHub pour que vous puissiez jouer avec.

Utilisation de Rails

Comme expliqué dans le tutoriel d'initialisation , le modèle Rails par défaut s'exécute au démarrage:

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

config/boot.rb contient:

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

qui fait le require 'bundler/setup' et établit le chemin requis.

config/application.rb fait:

Bundler.require(:default, Rails.env)

qui nécessite réellement les gemmes.

Chaque fois que vous spécifiez une gemme dans votre Gemfile et exécutez bundle install, l'assembleur ira installer la gem spécifiée et charger le code correspondant à cette gemme dans votre application en plaçant require 'whenever' de cette manière tous vos Gems dans votre Rails app, et vous pouvez appeler n'importe quelle méthode à partir de n'importe quel Gem sans aucune douleur, comme vous le faites la plupart du temps.

mais les gemmes comme whenever, faker or capistrano sont des éléments dont vous n'avez pas besoin dans le code de votre application mais dont vous avez besoin à chaque fois que le code de votre fichier schedule.rb permet de gérer les codes crons et capistrano dans le fichier deploy.rb pour personnaliser la recette de déploiement. vous n'avez pas besoin de charger le code de ces pierres précieuses dans votre code d'application et, chaque fois que vous souhaitez appeler une méthode à partir de ces pierres précieuses, vous pouvez exiger manuellement ces pierres précieuses vous-même en mettant require "whenever". donc vous mettez :require => false dans votre Gemfile pour ces gemmes, ainsi le bundler installera cette gemme mais ne chargera pas le code pour cette gemme elle-même, vous pouvez le faire quand vous voulez en mettant simplement require 'quand' dans votre cas.

8
Subhash Chandra

Afin de requérir des gemmes dans votre Gemfile, vous devrez appeler Bundler.require.

Vous pouvez empêcher le groupeur de requérir la gemme avec require: false, mais il faudra tout de même installer et gérer la gemme. Vérifiez this out pour une explication plus détaillée.

1
Nesha Zoric