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?
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.
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.
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
require bundler/setup
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.
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.