Ich werde über die Geschichte schreiben, wenn "LoadError (kann eine solche Datei nicht laden - Ihre_ruby_file_here)"
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"
Recommended Posts