rubocop / rubocop

A Ruby static code analyzer and formatter, based on the community Ruby style guide.

Home Page:https://docs.rubocop.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

uninitialized constant Bundler::SharedHelpers (NameError)

djberg96 opened this issue · comments

Curious warning/error with a rubocop rake task, which is simply defined as RuboCop::RakeTask.new in the Rakefile:

>bundler -v
Bundler version 2.5.10

>gem -v
3.5.10

>ruby -v
ruby 3.2.4 (2024-04-23 revision af471c0e01) [x86_64-linux]

>bundle exec rubocop -V
1.63.4 (using Parser 3.3.1.0, rubocop-ast 1.31.3, running on ruby 3.2.4) [x86_64-linux]
  - rubocop-rspec 2.29.2

>rake rubocop
rake aborted!
NameError: uninitialized constant Bundler::SharedHelpers (NameError)

      Bundler::SharedHelpers.filesystem_access(loaded_from, :read) do
             ^^^^^^^^^^^^^^^
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `block in require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:39:in `synchronize'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:39:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
Tasks: TOP => rubocop
(See full trace by running task with --trace)

I can't reproduce this. Can you give more detailed instructions?

Repo in question: https://github.com/djberg96/io-extra

bundle install then rake rubocop

Full backtrace:

dberger:/home/dberger/Dev/io-extra [main]>rake rubocop --trace
** Invoke rubocop (first_time)
** Execute rubocop
rake aborted!
NameError: uninitialized constant Bundler::SharedHelpers (NameError)

      Bundler::SharedHelpers.filesystem_access(loaded_from, :read) do
             ^^^^^^^^^^^^^^^
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/rubygems_ext.rb:151:in `data'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/stub_specification.rb:158:in `name'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/stub_specification.rb:88:in `activated?'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/specification.rb:1058:in `block in find_active_stub_by_path'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/specification.rb:1057:in `each'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/specification.rb:1057:in `find'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/specification.rb:1057:in `find_active_stub_by_path'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `block in require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:39:in `synchronize'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:39:in `require'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/rubygems_ext.rb:211:in `<module:Gem>'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/rubygems_ext.rb:33:in `<top (required)>'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:10:in `require_relative'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:10:in `<top (required)>'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop/lockfile.rb:6:in `<top (required)>'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop.rb:743:in `require_relative'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop.rb:743:in `<top (required)>'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
<internal:/home/dberger/.rbenv/versions/3.2.4/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:136:in `require'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop/rake_task.rb:47:in `run_cli'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop/rake_task.rb:26:in `block (2 levels) in initialize'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/file_utils_ext.rb:58:in `verbose'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.4/lib/rubocop/rake_task.rb:24:in `block in initialize'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
/home/dberger/.rbenv/versions/3.2.4/bin/rake:25:in `load'
/home/dberger/.rbenv/versions/3.2.4/bin/rake:25:in `<main>'
Tasks: TOP => rubocop

The weird thing is that I only see this on my Ubuntu laptop. Using my desktop Ubuntu VM, it works. Identical setup as far as I can tell. I double checked the results of bundler config (both empty) and neither has anything in a ~/.gemrc file.

Yeah, there must be more to this. I tried with your repo and it just works for me

If I just run rubocop without using the Rake task I see this:

>rubocop
Inspecting 2 files
..

2 files inspected, no offenses detected
No such file or directory @ rb_sysopen - /home/dberger/Dev/io-extra/Gemfile.lock
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:526:in `initialize'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:526:in `open'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:526:in `block in read_file'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler/shared_helpers.rb:103:in `filesystem_access'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/bundler-2.5.10/lib/bundler.rb:525:in `read_file'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/lockfile.rb:77:in `parser'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/lockfile.rb:30:in `dependencies'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/command/suggest_extensions.rb:74:in `all_extensions'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/command/suggest_extensions.rb:96:in `not_installed_extensions'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/command/suggest_extensions.rb:88:in `extensions'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/command/suggest_extensions.rb:18:in `run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/command.rb:11:in `run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli/environment.rb:18:in `run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:122:in `run_command'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:134:in `suggest_extensions'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:129:in `block in execute_runners'
<internal:kernel>:90:in `tap'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:129:in `execute_runners'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:51:in `block in run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:81:in `profile_if_needed'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/lib/rubocop/cli.rb:43:in `run'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/exe/rubocop:19:in `block in <top (required)>'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/3.2.0/benchmark.rb:311:in `realtime'
/home/dberger/.rbenv/versions/3.2.4/lib/ruby/gems/3.2.0/gems/rubocop-1.63.5/exe/rubocop:19:in `<top (required)>'
/home/dberger/.rbenv/versions/3.2.4/bin/rubocop:25:in `load'
/home/dberger/.rbenv/versions/3.2.4/bin/rubocop:25:in `<main>'

I dunno if this is a clue or what, but it works if I first, explicitly require 'bundler' at the top of the Rakefile and second, touch the Gemfile.lock file so that it exists before running the task. Why does it need this file to be present? No clue. It's not checked into the repo.

That's #12876, I have a PR open for that #12901. Maybe that also fixes this? Give it a try (I guess its a bit harder than just checking out the PR since it must be installed beforehand, not sure offhand how to do that).

For me the lockfile always generated before rubocop tried to access it

@Earlopain Seems to fix running rubocop, but not if run as a rake task.

@Earlopain I'm also sort of confused by the lockfile.rb code in general. If rubocop needs bundler to function properly, then why not make it a gem dependency instead of this rigamarole they've got going on in that file?

I guess it's more of a optional dependency. Since everything around it relies on the contents of a lockfile it's a safe assumption to make that bundler will be around as well. That's how I would rationalize it.

I think you may be running into a bundler bug. rubygems/rubygems#7647 seems very relevant as it mentions rakefiles and SharedHelpers. The description is too complicated for me to quickly understand but I think that may be it.

Downgrading bundler to 2.5.9 should confirm this.

Downgrading to 2.5.9 didn't seem to do it, though I'm also not 100% sure because downgrading bundler required some manual fiddling since it's a default gem. Could be, though.

But, that still wouldn't explain why it only seems to happen on my laptop.

It does say this:

However, the autoload does not seem to be triggering under some situations, such as when loading our own Rakefile. But that also does not happen always, but only when you have two different versions of psych installed in your system.

Which I guess could be a difference between your two machines. I installed a different psych version and didn't reproduce though

Yep, I'm only showing psych 5.01 on both systems.

Looks like a new bundler version released yesterday. Give that a try?

@Earlopain Yep, that seems to have fixed it, thanks!

Bundler 2.5.11 for anyone reading this.

Nice!