it-swarm.com.de

Ruby "Require" -Fehler: Diese Datei kann nicht geladen werden

Ich habe eine Datei, main.rb mit folgendem Inhalt:

require "tokenizer.rb"

Die tokenizer.rb-Datei befindet sich im same-Verzeichnis und ihr Inhalt ist:

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

Wenn ich versuche, main.rb auszuführen, erhalte ich die folgende Fehlermeldung:

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>'

Mir ist gerade aufgefallen, dass alles gut funktioniert, wenn ich load anstelle von require verwende. Was kann das Problem hier sein?

155
The Coding Monk

Ich habe es gerade ausprobiert und es funktioniert mit require "./tokenizer". Hoffe das hilft.

176
Pascal

Mach einfach das:

require_relative 'tokenizer'

Wenn Sie dies in einer Ruby-Datei ablegen, die sich in demselben Verzeichnis wie tokenizer.rb befindet, funktioniert das problemlos, egal wie Ihr aktuelles Arbeitsverzeichnis (CWD) ist.

Erklärung, warum dies der beste Weg ist

Die anderen Antworten geben an, dass Sie require './tokenizer' verwenden sollten. Dies ist jedoch die Antwort wrong , da dies nur dann funktioniert, wenn Sie Ihren Ruby-Prozess in demselben Verzeichnis ausführen, in dem sich tokenizer.rb befindet. Ziemlich der einzige Grund, sich die Verwendung von require so wäre das, wenn Sie Ruby 1.8 unterstützen müssen, das require_relative nicht hat.

Die require './tokenizer'-Antwort könnte für Sie heute noch funktionieren, schränkt jedoch unnötig ein, wie Sie Ihren Ruby-Code ausführen können. Wenn Sie Ihre Dateien in ein anderes Verzeichnis verschieben möchten oder Ihren Ruby-Prozess einfach aus einem anderen Verzeichnis heraus starten möchten, müssen Sie alle diese require -Anweisungen überdenken.

Die Verwendung von require für den Zugriff auf Dateien, die sich im Ladepfad befinden, ist eine feine Sache, und Ruby-Edelsteine ​​machen dies immer wieder. Sie sollten das Argument jedoch nicht mit einem . zu require beginnen, es sei denn, Sie tun etwas ganz Besonderes und wissen, was Sie tun.

Wenn Sie Code schreiben, der Annahmen über seine Umgebung aufstellt, sollten Sie sorgfältig überlegen, welche Annahmen gemacht werden sollen. In diesem Fall gibt es bis zu drei verschiedene Möglichkeiten, die tokenizer -Datei anzufordern, und jede davon nimmt eine andere Annahme an:

  1. require_relative 'path/to/tokenizer': Angenommen, der relative Pfad zwischen den beiden Ruby-Quelldateien bleibt gleich.
  2. require 'path/to/tokenizer': Angenommen, path/to/tokenizer befindet sich in einem der Verzeichnisse im Ladepfad ($LOAD_PATH). Dies erfordert im Allgemeinen eine zusätzliche Einrichtung, da Sie dem Ladepfad etwas hinzufügen müssen.
  3. require './path/to/tokenizer': Angenommen, der relative Pfad vom aktuellen Arbeitsverzeichnis des Ruby-Prozesses zu tokenizer.rb bleibt unverändert.

Ich denke, dass für die meisten Menschen und die meisten Situationen die in den Optionen Nr. 1 und Nr. 2 getroffenen Annahmen mit der Zeit wahrscheinlicher sind.

160
David Grayson

Ruby 1.9 hat das aktuelle Verzeichnis aus dem Ladepfad entfernt. Daher müssen Sie für diese Datei eine relative Anforderung ausführen, wie David Grayson sagt:

require_relative 'tokenizer'

Es gibt keine Notwendigkeit, es mit .rb zu ergänzen, da Ruby klug genug ist, um zu wissen, dass Sie das sowieso meinen.

81
Ryan Bigg

require lädt eine Datei aus dem $LOAD_PATH. Wenn Sie eine Datei relativ zur aktuell ausgeführten Datei anstelle von $LOAD_PATH benötigen, verwenden Sie require_relative.

36
Jörg W Mittag

Ich würde empfehlen,

load './tokenizer.rb'

Vorausgesetzt, Sie wissen, dass sich die Datei im selben Arbeitsverzeichnis befindet.

Wenn Sie versuchen, es relativ zur Datei anzufordern, können Sie verwenden

require_relative 'tokenizer'

Ich hoffe das hilft.

14

Eine weitere nette Methode ist, das aktuelle Verzeichnis in Ihren Ladepfad aufzunehmen

$:.unshift('.')

Sie könnten es auf das $: ($ LOAD_PATH) -Array schieben, aber das Verschieben zwingt es, Ihr aktuelles Arbeitsverzeichnis vor dem Rest des Ladepfads zu laden.

Nachdem Sie Ihr aktuelles Verzeichnis zu Ihrem Ladepfad hinzugefügt haben, müssen Sie nicht mehr angeben

 require './tokenizer' 

und kann einfach wieder zur Verwendung gehen 

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

Dies funktioniert gut, wenn es sich in einem gem-lib-Verzeichnis befindet und dies die tokenizer.rb ist

1

Zuerst :

$ Sudo gem install colored2

Und Sie sollten Ihr Passwort eingeben 

Dann :

$ Sudo gem update --system  

Erscheinen Aktualisieren von rubygems-update FEHLER: Beim Ausführen von gem ... (OpenSSL :: SSL :: SSLError) Hostname "gems.Ruby-china.org" stimmt nicht mit dem Serverzertifikat überein

Dann:

$  rvm -v
$ rvm get head

Letzte Welche Sprache möchten Sie verwenden? [Swift/ObjC]

ObjC

Möchten Sie Ihrer Bibliothek eine Demoanwendung hinzufügen? [ Ja Nein ]

Ja

Welche Testframeworks werden Sie verwenden? [Specta/Kiwi/Keine]

None

Möchten Sie auf Sicht basierende Tests durchführen? [ Ja Nein ]

Nein

Was ist dein Klassenpräfix?

XMG

Laufende Pod-Installation für Ihre neue Bibliothek.

0
Lxt_91424

Für diejenigen, die absolut sicher sind, dass ihr relativer Pfad korrekt ist, bestand mein Problem darin, dass meine Dateien nicht die Erweiterung .rb hatten! (Obwohl ich RubyMine zum Erstellen der Dateien verwendet habe und ausgewählt habe, dass es sich bei der Erstellung um Ruby-Dateien handelt.)

Überprüfen Sie die Dateierweiterungen Ihrer Datei!

0
Andy Barnett

Ich habe jruby-1.7.4 verwendet, um meinen Ruby-Code zu kompilieren. 

require 'roman-numerals.rb' 

ist der Code, der den folgenden Fehler ausgelöst hat. 

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

Ich habe RB von Requirement entfernt und gegeben 

require 'roman-numerals' 

Es hat gut funktioniert. 

0

Wie wäre es, das aktuelle Verzeichnis in den Suchpfad aufzunehmen?

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

Das Problem ist, dass require nicht aus dem aktuellen Verzeichnis geladen wird. Das habe ich auch gedacht, aber dann habe ich diesen Thread gefunden. Zum Beispiel habe ich folgenden Code ausprobiert:

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>'

Wie man sehen kann, las sie die Datei in Ordnung, aber ich konnte sie nicht anfordern (der Pfad wurde nicht erkannt). und hier geht der Code, der funktioniert:

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

Wie Sie sehen, wird die Datei korrekt geladen, wenn Sie den vollständigen Pfad angeben.

0
Boris Strandjev