Wenn Sie LoadError erhalten (kann eine solche Datei --ruby_file nicht laden), wenn Sie dies in Ruby benötigen

Einführung

Ich werde über die Geschichte schreiben, wenn "LoadError (kann eine solche Datei nicht laden - Ihre_ruby_file_here)"

Dieser Fall

Ruby-Version

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]

Dies ist der Fall bei der Ordnerstruktur

$ tree
.
├── module.rb
└── sub_modules
    ├── sub_module_a.rb
    ├── sub_module_b.rb
    └── sub_module_c.rb

module.rb


require 'sub_modules/sub_module_a'
require 'sub_modules/sub_module_b'
require 'sub_modules/sub_module_c'

module MainModule
  Version = "2.3.0"
end

sub_modules/sub_module_a.rb


module SubModuleA
 Version = "1.0.0"
end

Der Versuch, in dieser Situation module.rb von main zu laden, kann zu einem Fehler führen

require oder require_relative

irb(main):004:0> require 'module'
Traceback (most recent call last):
        7: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `<main>'
        6: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `load'
        5: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
        4: from (irb):3
        3: from (irb):4:in `rescue in irb_binding'
        2: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
        1: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
LoadError (cannot load such file -- module)

Dies scheint zu bedeuten, dass "module.rb" nicht gefunden werden kann, da sich das aktuelle Verzeichnis nicht in "$ LOAD_PATH" befindet, auf das durch "require" verwiesen wird. Fügen Sie also . / Hinzu und versuchen Sie es wie folgt

irb(main):006:0> require './module'
Traceback (most recent call last):
       10: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `<main>'
        9: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `load'
        8: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
        7: from (irb):5
        6: from (irb):6:in `rescue in irb_binding'
        5: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
        4: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
        3: from /Users/masaino/load_path/module.rb:1:in `<top (required)>'
        2: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
        1: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
LoadError (cannot load such file -- sub_module_a)

Die Fehlermeldung wurde in "LoadError (solche Datei kann nicht geladen werden - sub_module_a)" geändert. Das "Modul" selbst kann geladen werden, aber in diesem Fall erfordert "main.rb" weiterhin das "sub_module", so dass es dort kaputt zu sein scheint.

Es gibt auch "require_relative" als "require mit einem relativen Pfad aus der aktuellen Datei", aber das Ergebnis ist das gleiche.

irb(main):005:0> require_relative 'module'
Traceback (most recent call last):
        9: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `<main>'
        8: from /Users/masaino/.rbenv/versions/2.7.1/bin/irb:23:in `load'
        7: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
        6: from (irb):4
        5: from (irb):5:in `rescue in irb_binding'
        4: from (irb):5:in `require_relative'
        3: from /Users/masaino/load_path/module.rb:1:in `<top (required)>'
        2: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
        1: from /Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
LoadError (cannot load such file -- sub_module_a)

$LOAD_PATH

Es scheint also besser, das aktuelle Verzeichnis gehorsam auf "$ LOAD_PATH" zu setzen. Was passiert überhaupt mit dem aktuellen $ LOAD_PATH?

irb(main):001:0> puts $LOAD_PATH
/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/x86_64-darwin19
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby/2.7.0
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby/2.7.0/x86_64-darwin19
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0
/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/x86_64-darwin19
=> nil

Natürlich gibt es kein aktuelles Verzeichnis, also werde ich es hinzufügen

irb(main):002:0> $LOAD_PATH.push('.')
=> ["/usr/local/Cellar/rbenv/1.1.2/rbenv.d/exec/gem-rehash", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/x86_64-darwin19", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/site_ruby", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby/2.7.0", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby/2.7.0/x86_64-darwin19", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/vendor_ruby", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0", "/Users/masaino/.rbenv/versions/2.7.1/lib/ruby/2.7.0/x86_64-darwin19", "."]

Als ich es wieder geladen habe, hat es funktioniert: thumbsup:

irb(main):006:0> require 'module'
=> true
irb(main):003:0> MainModule::Version
=> "2.3.0"
irb(main):004:0> SubModuleA::Version
=> "1.0.0"

Referenzierte Site

Recommended Posts

Wenn Sie LoadError erhalten (kann eine solche Datei --ruby_file nicht laden), wenn Sie dies in Ruby benötigen
Lösen Sie LoadError (kann eine solche Datei --bcrypt nicht laden), die im Rails-Test auftritt (Rails-Tutorial, Kapitel 6).
Wenn Sie sich im Klassennamen verlieren
Die Installation von rbenv 2.7.1 schlägt fehl, wenn "kein akzeptabler C-Compiler in $ PATH gefunden wurde" und "eine solche Datei nicht geladen werden kann".
Textdateien, die in Ressourcen in Java abgelegt sind, können nicht gelesen werden, wenn sie beschädigt sind
Führen Sie den Befehl Rails Server unter Windows 10, Ruby2.6.6 aus und erhalten Sie "Kann eine solche Datei nicht laden --sqlite3 / sqlite3_native".