From: merch-redmine@... Date: 2021-04-28T20:30:53+00:00 Subject: [ruby-core:103646] [Ruby master Bug#16680] Symlink folder in $LOAD_PATH does not work with autoload Issue #16680 has been updated by jeremyevans0 (Jeremy Evans). Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED Status changed from Open to Closed I tried this with Ruby 2.6, 2.7, and 3.0, and got the same results with all three: ``` $ ls -ld /home/jeremy/tmp/looksee1 lrwxr-xr-x 1 jeremy jeremy 7 Apr 28 13:19 /home/jeremy/tmp/looksee1 -> looksee $ ruby26 -I /home/jeremy/tmp/looksee1/lib -r looksee -e 'puts 100' /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- looksee/mri.so (LoadError) from /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require' from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:171:in `' from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:4:in `' from /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require' from /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require' from /home/jeremy/tmp/looksee/lib/looksee.rb:1:in `' from /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require' from /usr/local/lib/ruby/2.6/rubygems/core_ext/kernel_require.rb:54:in `require' $ ruby27 -I /home/jeremy/tmp/looksee1/lib -r looksee -e 'puts 100' Traceback (most recent call last): 8: from /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require' 7: from /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require' 6: from /home/jeremy/tmp/looksee/lib/looksee.rb:1:in `' 5: from /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require' 4: from /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require' 3: from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:4:in `' 2: from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:171:in `' 1: from /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require' /usr/local/lib/ruby/2.7/rubygems/core_ext/kernel_require.rb:83:in `require': cannot load such file -- looksee/mri.so (LoadError) $ ruby30 -I /home/jeremy/tmp/looksee1/lib -r looksee -e 'puts 100' :85:in `require': cannot load such file -- looksee/mri.so (LoadError) from :85:in `require' from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:171:in `' from /home/jeremy/tmp/looksee/lib/looksee/clean.rb:4:in `' from :85:in `require' from :85:in `require' from /home/jeremy/tmp/looksee/lib/looksee.rb:1:in `' from :85:in `require' from :85:in `require' ``` I tried with both the master branch and the v4.2.0 tag for looksee with the same results, just in case looksee had worked around this problem another way. So I think this problem has been resolved by Ruby 2.7.3. If you can still recreate the issue on Ruby 2.7.3, please bisect to find the failing commit and fixing commit, and note it in this ticket, and we can mark this for backporting. ---------------------------------------- Bug #16680: Symlink folder in $LOAD_PATH does not work with autoload https://bugs.ruby-lang.org/issues/16680#change-91742 * Author: zw963 (Wei Zheng) * Status: Closed * Priority: Normal * ruby -v: 2.7.0 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: REQUIRED ---------------------------------------- The following is a full reproducible process. I will use a gem named 'looksee' to reproduce this. 1. Do `gem install looksee` 2. Go to `gem` folder and copy `lib` content into `/tmp/test_looksee` so that 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 symlink 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 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) ``` You may want to ask why use symlinks folder in `$LOAD_PATH`. I think this is a quite common case; many ruby developers have a local gem not managed by `Rubygems` or `Bundler`. They just use `$LOAD_PATH` to `require`/`load` it, and it is hard to ensure everyone's folder is not a symlink. I think this is a breaking change. All those codes worked quite well before 2.7 because old codes always follow symlinks. The following is an example from ruby 2.6.3, which works. ```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 seen, those breaking codes come from `autoload :Adapter, 'looksee/adapter'`. I suspect maybe this is caused by nested autoload. But this is only a guess, please check. Thank you. ![](clipboard-202003080224-xglcq.png) ---Files-------------------------------- clipboard-202003080224-xglcq.png (183 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: