2016-07-04 1 views
1

Je fais des efforts pour essayer de mieux comprendre le fonctionnement du bundler. J'ai seulement trois fichiers dans mon répertoire de travail:Pourquoi est-ce que j'obtiens NameError avec `bundle exec ruby ​​[fichier]` étant donné que la gemme nécessaire est dans Gemfile?

Gemfile Gemfile.lock test.rb

Tous les Gemfile a est gem "slop" et test.rb ressemble à ceci:

puts Slop.parse

Quand je lance bundle exec test.rb je reçois un NameError en raison de ne pas avoir une déclaration require:

[[email protected] my_app]$ bundle exec ruby test.rb 
test.rb:1:in `<main>': uninitialized constant Slop (NameError) 

Mais si je lance bundle console, Bundler charge le bijou correctement et je peux courir Slop.parse de la console sans avoir à taper explicitement require "slop":

[[email protected] my_app]$ bundle console 
irb(main):001:0> Slop.parse 
=> #<Slop::Result:0x00000001339838... 

Alors qu'est-ce que je suis absent? J'étais sous l'impression que puisque je n'ai pas require: false dans mon Gemfile, Slop devrait être chargé quand je cours bundle exec ruby test.rb et je ne devrais pas devoir mettre la ligne require "slop" dans le dossier.

Répondre

0

J'avais l'impression que depuis que je n'ai pas require: false en mon Gemfile, Slop devrait être chargé lorsque je cours bundle exec ruby ​​test.rb et je ne devrais pas avoir besoin de mettre la ligne "slop" exiger dans le fichier.

Le bundler docs disent:

Indiquez vos dépendances dans un Gemfile dans votre racine de projet:

source 'https://rubygems.org' 

gem 'nokogiri' #<======HERE 

l'intérieur de votre application, charger l'environnement groupé :

require 'rubygems' 
require 'bundler/setup' 

# require your gems as usual 
require 'nokogiri' #<========AND HERE 

Quant à ceci:

J'avais l'impression que depuis que je n'ai pas require: false dans mon Gemfile, Slop doit être chargé quand je lance paquet test Ruby exec. rb et je n'aurais pas besoin de mettre la ligne require "slop" dans le fichier.

Les documents bundler sont horribles sur ce point.Autant que je sache, :require => false est une chose spécifique à Rails, qui est utilisée pour réduire les temps de chargement au démarrage du projet. Dans une application rails, en spécifiant require: false signifie que la gemme ne sera pas chargée tant que vous n'aurez pas besoin de la gemme manuellement. Si vous ne spécifiez pas :require => false, alors la gemme sera chargée automatiquement - mais c'est parce que le code des rails est écrit pour faire ce chargement automatique. Votre application n'a aucun code qui remplit une fonction similaire.

Édition: Nous avons fait une erreur lors du test. Voici comment cela fonctionne: Dans une application non-rails, par ex. dans votre test.rb, si vous voulez exiger automatiquement toutes les gemmes spécifiées dans votre Gemfile, vous devez écrire:

Bundler.require :default 

La mention Bundler docs que dans les petits caractères ici:

Spécifiez :require => false pour empêcher bundler d'exiger la gemme, mais toujours l'installer et maintenir les dépendances.

gem 'rspec', :require => false 
gem 'sqlite3' 

Afin d'exiger des pierres précieuses dans votre Gemfile, vous devrez appeler Bundler.require dans votre application.

Je ne sais pas pourquoi cette exigence n'a été mentionnée conjointement avec require: false au lieu d'être indiqué au début.

Et, dans votre Gemfile si vous spécifiez:

gem 'slop', :require => false 

(ainsi que dans Bundler.require :default test.rb), alors vous devez aussi exiger explicitement la pierre précieuse slops dans test.rb:

require 'slop' 

En d'autres termes, Bundler.require :default requiert automatiquement toutes les gemmes dans votre Gemfile à l'exception des gemmes marquées require: false. Pour les gemmes marquées avec require: false, vous devez écrire manuellement require 'gem_name' dans votre application.

Par conséquent, neydroid posté la bonne solution.


* Dans votre Gemfile, vous pouvez les pierres précieuses des nids dans les groupes, ce qui affecte la façon dont Bundler.require() fonctionne. Voir le Bundler docs on groups.

+0

Aucune idée pourquoi cela a été downvoted mais j'ai donné 1 et apprécier la rigueur – sixty4bit

-2

Vous devez ajouter le besoin « slops » à l'intérieur de votre test.rb