Bug #16680
Updated by sawa (Tsuyoshi Sawada) over 4 years ago
The following Following is a full reproducible process. I procees, i will use a gem named 'looksee' to reproduce this. 1. Do `gem gem install looksee` looksee 2. Go to `gem` folder and goto gem folder, copy `lib` lib content into `/tmp/test_looksee` so that /tmp/tesst_looksee so, for now, we have a folder like this: ```sh ╰─ $ tree /tmp/test_looksee /tmp/test_looksee └── lib ├── looksee │ ├── adapter │ │ ├── base.rb │ │ └── rubinius.rb │ ├── adapter.rb │ ├── clean.rb │ ├── columnizer.rb │ ├── core_ext.rb │ ├── editor.rb │ ├── help.rb │ ├── inspector.rb │ ├── lookup_path.rb │ ├── mri.so │ └── version.rb └── looksee.rb ``` 3. Create create a new symlink symlinks to this folder. ```sh ╰─ $ln -s /tmp/test_looksee /tmp/test_looksee1 ╰─ $ ls -alhd /tmp/test_looksee* drwxr-xr-x 3 zw963 zw963 60 2020-03-08 01:39 /tmp/test_looksee/ lrwxrwxrwx 1 zw963 zw963 13 2020-03-08 02:08 /tmp/test_looksee1 -> test_looksee// ``` 4. Run the run following command to reproduce this issue. ```sh ╰─ $ ruby -I/tmp/test_looksee1/lib/ -rlooksee -e 'puts 100' Traceback (most recent call last): 10: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 9: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 8: from /tmp/test_looksee1/lib/looksee.rb:1:in `<top (required)>' 7: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 6: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 5: from /tmp/test_looksee1/lib/looksee/clean.rb:4:in `<top (required)>' 4: from /tmp/test_looksee1/lib/looksee/clean.rb:171:in `<module:Looksee>' 3: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 2: from /home/zw963/others/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:72:in `require' 1: from /tmp/test_looksee1/lib/looksee/adapter.rb:1:in `<top (required)>' /tmp/test_looksee1/lib/looksee/adapter.rb:2:in `<module:Looksee>': uninitialized constant Looksee::Adapter (NameError) ``` You may So, maybe you want to ask why use symlinks folder in `$LOAD_PATH`. I $LOAD_PATH, but, i think this is should be a quite common case; case, many ruby developers developer have a local gem not managed manager by `Rubygems` or `Bundler`. They `Bundler`, it just use `$LOAD_PATH` to `require`/`load` require/load it, and it is hard to ensure everyone's everyone folder is not a symlink. I think this is a ** breaking change. All change** , becuase all those codes worked code is work quite well before 2.7 2.7, because old codes code always follow symlinks. The following symlinks, following is an a example from ruby 2.6.3, which works. it working. ```sh ╰─ $ ruby -I/tmp/test_looksee1/lib/ -rlooksee -e 'puts 100' Traceback (most recent call last): 8: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 7: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 6: from /tmp/test_looksee/lib/looksee.rb:1:in `<top (required)>' 5: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 4: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' 3: from /tmp/test_looksee/lib/looksee/clean.rb:4:in `<top (required)>' 2: from /tmp/test_looksee/lib/looksee/clean.rb:171:in `<module:Looksee>' 1: from /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' /home/zw963/others/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': incompatible library version - /tmp/test_looksee/lib/looksee/mri.so (LoadError) ``` As we can seen, see, those breaking codes code come from `autoload :Adapter, 'looksee/adapter'`. I 'looksee/adapter'`, i suspect maybe this is caused by nested autoload. But autoload cause this is new issue, but only a guess, please check. Thank check, thank you. 