J'écrirai à propos de l'histoire quand LoadError (ne peut pas charger un tel fichier --your_ruby_file_here)
Version rubis
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
C'est le cas de la structure des dossiers
$ 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
Tenter de charger module.rb
à partir de main dans cette situation peut entraîner une erreur
require
ou 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)
Cela semble signifier que module.rb
est introuvable car le répertoire courant n'est pas dans $ LOAD_PATH
référencé par require
. Ajoutez donc . /
Et essayez comme suit
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)
Le message d'erreur est devenu LoadError (impossible de charger un tel fichier --sub_module_a)
. Le module
lui-même peut être chargé, mais dans ce cas main.rb
nécessite en outre le sous-module
, donc il semble y être cassé.
Il y a aussi «require_relative» comme «require avec un chemin relatif du fichier courant», mais le résultat est le même.
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
Il semble donc préférable de définir le répertoire courant sur $ LOAD_PATH
docilement. Que se passe-t-il avec le $ LOAD_PATH
actuel en premier lieu?
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
Il n'y a certainement pas de répertoire courant donc je vais l'ajouter
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", "."]
Quand je l'ai chargé à nouveau, cela a fonctionné: 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