web-dev-qa-db-fra.com

Ruby 'require' error: impossible de charger un tel fichier

J'ai un fichier, main.rb avec le contenu suivant:

require "tokenizer.rb"

Le fichier tokenizer.rb est dans le répertoire same et son contenu est le suivant:

class Tokenizer
    def self.tokenize(string)
        return string.split(" ")
    end
end

Si j'essaye de lancer main.rb j'obtiens l'erreur suivante:

C:\Documents and Settings\my\src\folder>Ruby main.rb

C:/Ruby193/lib/Ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
        from C:/Ruby193/lib/Ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
        from main.rb:1:in `<main>'

Je viens de remarquer que si j'utilise load au lieu de require, tout se passe bien. Quel est le problème ici?

155
The Coding Monk

Je viens d'essayer et cela fonctionne avec require "./tokenizer". J'espère que cela t'aides.

176
Pascal

Faites juste ceci:

require_relative 'tokenizer'

Si vous placez cela dans un fichier Ruby qui se trouve dans le même répertoire que tokenizer.rb, tout fonctionnera correctement, quel que soit votre répertoire de travail actuel (CWD).

Explication de pourquoi c'est le meilleur moyen

Les autres réponses demandent que vous utilisiez require './tokenizer', mais c’est la réponse false, car elle ne fonctionnera que si vous exécutez votre processus Ruby dans le même répertoire que celui où se trouve tokenizer.rb. La seule raison pour laquelle vous envisagez d’utiliser require comme ce serait le cas si vous avez besoin de supporter Ruby 1.8, qui n'a pas require_relative.

La réponse require './tokenizer' pourrait vous convenir aujourd'hui, mais elle limite inutilement la manière dont vous pouvez exécuter votre code Ruby. Demain, si vous souhaitez déplacer vos fichiers dans un autre répertoire, ou si vous souhaitez simplement démarrer votre processus Ruby à partir d'un autre répertoire, vous devrez repenser toutes ces instructions require.

Utiliser require pour accéder aux fichiers qui se trouvent sur le chemin de chargement est une bonne chose, et Ruby Gems le fait tout le temps. Mais vous ne devriez pas commencer l'argument de require avec un . à moins que vous ne fassiez quelque chose de très spécial et que vous sachiez ce que vous faites.

Lorsque vous écrivez du code qui émet des hypothèses sur son environnement, vous devez réfléchir soigneusement aux hypothèses à formuler. Dans ce cas, il y a jusqu'à trois manières différentes d'exiger le fichier tokenizer, et chacune émet une hypothèse différente:

  1. require_relative 'path/to/tokenizer': supposons que le chemin relatif entre les deux fichiers source Ruby reste le même.
  2. require 'path/to/tokenizer': Supposons que path/to/tokenizer se trouve dans l'un des répertoires du chemin de chargement ($LOAD_PATH). Cela nécessite généralement une configuration supplémentaire, car vous devez ajouter quelque chose au chemin de chargement.
  3. require './path/to/tokenizer': suppose que le chemin relatif du répertoire de travail actuel du processus Ruby vers tokenizer.rb reste inchangé.

Je pense que pour la plupart des gens et des situations, les hypothèses des options 1 et 2 ont plus de chances de se vérifier au fil du temps.

160
David Grayson

Ruby 1.9 a supprimé le répertoire en cours du chemin de chargement et vous devrez donc effectuer une requête relative sur ce fichier, comme le dit David Grayson:

require_relative 'tokenizer'

Il n'est pas nécessaire de le remplacer par .rb, car Ruby est assez intelligent pour savoir ce que vous voulez dire.

81
Ryan Bigg

require charge un fichier à partir du $LOAD_PATH. Si vous souhaitez exiger un fichier relatif au fichier en cours d'exécution au lieu de $LOAD_PATH, utilisez require_relative.

36
Jörg W Mittag

Je recommanderais,

load './tokenizer.rb'

Étant donné que vous savez que le fichier se trouve dans le même répertoire de travail.

Si vous essayez de l'exiger par rapport au fichier, vous pouvez utiliser

require_relative 'tokenizer'

J'espère que ça aide.

14

Une autre petite méthode intéressante consiste à inclure le répertoire actuel dans votre chemin de chargement avec

$:.unshift('.')

Vous pouvez le pousser sur le tableau $: ($ LOAD_PATH) mais unshift le forcera à charger votre répertoire de travail actuel avant le reste du chemin de chargement.

Une fois que vous avez ajouté votre répertoire actuel dans votre chemin de chargement, vous n'avez plus besoin de spécifier

 require './tokenizer' 

et peut simplement revenir à l'aide 

require 'tokenizer'
11
Pseudomonkey
require_relative 'tokenizer/main'

Cela fonctionnera bien s'il se trouve dans un répertoire gem lib et que c'est le tokenizer.rb

1
Douglas G. Allen

Premier :

$ Sudo gem install colored2

Et, vous devez entrer votre mot de passe 

Ensuite :

$ Sudo gem update --system  

Apparaître Mise à jour de rubygems-update ERREUR: lors de l’exécution de gem ... (OpenSSL :: SSL :: SSLError) nom d'hôte "gems.Ruby-china.org" ne correspond pas au certificat de serveur

Ensuite:

$  rvm -v
$ rvm get head

Dernier Quelle langue voulez-vous utiliser? [Swift/ObjC]

ObjC

Souhaitez-vous inclure une application de démonstration avec votre bibliothèque? [ Oui Non ]

Oui

Quels frameworks de test utiliserez-vous? [Specta/Kiwi/Aucun]

None

Souhaitez-vous effectuer des tests de vue? [ Oui Non ]

Non

Quel est votre préfixe de classe?

XMG

Installation en cours d'exécution sur votre nouvelle bibliothèque.

0
Lxt_91424

Pour ceux qui sont absolument sûrs que leur chemin relatif est correct, mon problème était que mes fichiers n'avaient pas l'extension .rb! (Même si j’ai utilisé RubyMine pour créer les fichiers et sélectionné comme tels Ruby lors de leur création.)

Vérifiez les extensions de fichier sur votre fichier!

0
Andy Barnett

J'ai utilisé jruby-1.7.4 pour compiler mon code Ruby. 

require 'roman-numerals.rb' 

est le code qui a jeté l'erreur ci-dessous. 

LoadError: no such file to load -- roman-numerals
  require at org/jruby/RubyKernel.Java:1054
  require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/Ruby/shared/rubygems/custom_require.rb:36
   (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

J'ai enlevé rb de require et ai donné 

require 'roman-numerals' 

Cela a bien fonctionné. 

0
Ananth Srinivasan

Qu'en est-il d'inclure le répertoire actuel dans le chemin de recherche?

Ruby -I. main.rb
0
Hans-J. Schmid

Le problème est que require ne se charge pas à partir du répertoire actuel. C’est ce que je pensais aussi mais j’ai trouvé ce thread . Par exemple, j'ai essayé le code suivant:

irb> f = File.new('blabla.rb')
=> #<File:blabla.rb>
irb> f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
LoadError: cannot load such file -- blabla.rb
        from D:/dev/Ruby193/lib/Ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from D:/dev/Ruby193/lib/Ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from (irb):24
        from D:/dev/Ruby193/bin/irb:12:in `<main>'

Comme on peut le voir, le fichier a été lu, mais je n’ai pas pu le demander (le chemin n’a pas été reconnu). et voici le code qui fonctionne:

irb f = File.new('D://blabla.rb')
=> #<File:D://blabla.rb>
irb f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
=> true

Comme vous pouvez le voir si vous spécifiez le chemin d'accès complet, le fichier est chargé correctement.

0
Boris Strandjev