From: nobu@... Date: 2020-06-13T23:26:00+00:00 Subject: [ruby-core:98794] [Ruby master Bug#16680] [Breaking Change] Ruby 2.7 not support symlinks folder in $LOAD_PATH to work with autoload. Issue #16680 has been updated by nobu (Nobuyoshi Nakada). I could reproduce it with 2.7.1 and 2.7 head. ---------------------------------------- Bug #16680: [Breaking Change] Ruby 2.7 not support symlinks folder in $LOAD_PATH to work with autoload. https://bugs.ruby-lang.org/issues/16680#change-86153 * Author: zw963 (Wei Zheng) * Status: Open * Priority: Normal * ruby -v: 2.7.0 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- Following is a full reproducible procees, i will use a gem named 'looksee' to reproduce this. 1. gem install looksee 2. goto gem folder, copy lib content into /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 a new 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 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 `' 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 `' 4: from /tmp/test_looksee1/lib/looksee/clean.rb:171:in `' 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 `' /tmp/test_looksee1/lib/looksee/adapter.rb:2:in `': uninitialized constant Looksee::Adapter (NameError) ``` So, maybe you want to ask why use symlinks folder in $LOAD_PATH, but, i think this should be a quite common case, many ruby developer have local gem not manager by `Rubygems` or `Bundler`, it just use `$LOAD_PATH` to require/load it, it hard to ensure everyone folder is not a symlink. I think this is a ** breaking change** , becuase all those code is work quite well before 2.7, because old code always following symlinks, following is a example from ruby 2.6.3, 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 `' 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 `' 2: from /tmp/test_looksee/lib/looksee/clean.rb:171:in `' 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 see, those breaking code come from `autoload :Adapter, 'looksee/adapter'`, i suspect maybe nested autoload cause this new issue, but only a guess, please check, thank you. ![](clipboard-202003080224-xglcq.png) ---Files-------------------------------- clipboard-202003080224-xglcq.png (183 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: