ruby / ruby/rubygems

auto_install fails if Gemfile.lock has stdlib gem dependency that bundler also uses

Open
#6,872 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Bundler
Dominant language
Ruby
Stars
4k
Forks
1.9k
Avg merge
1d 2h
Merged PRs (30d)
81

Description

Describe the problem as clearly as you can

While working on https://github.com/rubygems/rubygems/pull/6561 , I found that if I try to use a bundle subcommand that supports auto_install, and the bundle contains a version of a stdlib that bundler uses but is a different version from what is in the stdlib, then the command will successfully auto_install, but then fail to actually run because a different version of the gem has been activated.

Subsequent calls do work.

Did you try upgrading rubygems & bundler?

Yes, tested on rubygems 3.4.18 and bundler 2.4.18.

I've also bundler tested on master while working on https://github.com/rubygems/rubygems/pull/6561

Post steps to reproduce the problem

Create a Gemfile:

# frozen_string_literal: true

source "https://rubygems.org"

# could be anything, just happened to choose this
gem "rubocop" 

# needs to be something from stdlib that bundler uses
# and a version different from what's in the standard gems
#
# see https://stdgems.org/ for current gems & version
# ruby 3.2.2 uses 5.0.1, for example
gem "psych", "4.0.3"

Run the commands:

bundle config auto_install true

# make sure the gem is missing, so auto_install will kick in
gem uninstall rubocop --force --executables

# run something that triggers auto install, ie `bundle exec`
Which command did you run?

Run a bundle subcommand that uses auto_install (ie exec):

$ bundle exec rubocop --version
What were you expecting to happen?

I'd have expected the gems to be installed, and then run the command, ie:

$ bundle exec rubocop --version
1.56.0
What actually happened?
$ bundle exec rubocop --version
Automatically installing missing gems.
Fetching gem metadata from https://rubygems.org/........
Fetching rubocop 1.56.0
Installing rubocop 1.56.0
Bundle complete! 2 Gemfile dependencies, 17 gems now installed.
Use bundle info [gemname] to see where a bundled gem is installed.
bundler: failed to load command: rubocop (/Users/josh.nichols/.rbenv/versions/3.2.2/bin/rubocop)
/Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/runtime.rb:304:in check_for_activated_spec!': You have already activated psych 5.1.0, but your Gemfile requires psych 4.0.3. Prepending bundle exec to your command may solve this. (Gem::LoadError)
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/runtime.rb:25:in block in setup'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/spec_set.rb:165:in each'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/spec_set.rb:165:in each'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/runtime.rb:24:in map'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/runtime.rb:24:in setup'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler.rb:162:in setup'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/setup.rb:10:in block in <top (required)>'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/ui/shell.rb:159:in with_level'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/ui/shell.rb:111:in silence'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/setup.rb:10:in <top (required)>'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli/exec.rb:56:in require_relative'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli/exec.rb:56:in kernel_load'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli/exec.rb:23:in run'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli.rb:492:in exec'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/vendor/thor/lib/thor/command.rb:27:in run'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in invoke_command'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/vendor/thor/lib/thor.rb:392:in dispatch'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli.rb:34:in dispatch'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/vendor/thor/lib/thor/base.rb:485:in start'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/cli.rb:28:in start'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/exe/bundle:37:in block in <top (required)>'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/lib/bundler/friendly_errors.rb:117:in with_friendly_errors'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.18/exe/bundle:29:in <top (required)>'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/bin/bundle:25:in load'
	from /Users/josh.nichols/.rbenv/versions/3.2.2/bin/bundle:25:in <main>'

Environment

Bundler       2.4.18
  Platforms   ruby, arm64-darwin-22
Ruby          3.2.2p53 (2023-03-30 revision e51014f9c05aa65cbf203442d37fef7c12390015) [arm64-darwin-22]
  Full Path   /Users/josh.nichols/.rbenv/versions/3.2.2/bin/ruby
  Config Dir  /Users/josh.nichols/.rbenv/versions/3.2.2/etc
RubyGems      3.4.12
  Gem Home    /Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  Gem Path    /Users/josh.nichols/.gem/ruby/3.2.0:/Users/josh.nichols/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  User Home   /Users/josh.nichols
  User Path   /Users/josh.nichols/.gem/ruby/3.2.0
  Bin Dir     /Users/josh.nichols/.rbenv/versions/3.2.2/bin
Tools
  Git         2.41.0
  RVM         not installed
  rbenv       rbenv 1.2.0
  chruby

Bundler Build Metadata

Built At          2023-08-02
Git SHA           d2e3d8e3f4
Released Version  true

Bundler settings

auto_install
  Set for your local app (/Users/josh.nichols/workspace/auto-install-demo/.bundle/config): true
build.idn-ruby
  Set for the current user (/Users/josh.nichols/.bundle/config): "--with-idn-dir=/opt/homebrew/opt/libidn"
gem.changelog
  Set for the current user (/Users/josh.nichols/.bundle/config): false
gem.ci
  Set for the current user (/Users/josh.nichols/.bundle/config): false
gem.coc
  Set for the current user (/Users/josh.nichols/.bundle/config): false
gem.linter
  Set for the current user (/Users/josh.nichols/.bundle/config): false
gem.mit
  Set for the current user (/Users/josh.nichols/.bundle/config): false
gem.test
  Set for the current user (/Users/josh.nichols/.bundle/config): false
unset
  Set for the current user (/Users/josh.nichols/.bundle/config): "jobs"

Gemfile

Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

gem "rubocop"
gem "psych", "4.0.3"
Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    ast (2.4.2)
    base64 (0.1.1)
    json (2.6.3)
    language_server-protocol (3.17.0.3)
    parallel (1.23.0)
    parser (3.2.2.3)
      ast (~> 2.4.1)
      racc
    psych (4.0.3)
      stringio
    racc (1.7.1)
    rainbow (3.1.1)
    regexp_parser (2.8.1)
    rexml (3.2.6)
    rubocop (1.56.0)
      base64 (~> 0.1.1)
      json (~> 2.3)
      language_server-protocol (>= 3.17.0)
      parallel (~> 1.10)
      parser (>= 3.2.2.3)
      rainbow (>= 2.2.2, < 4.0)
      regexp_parser (>= 1.8, < 3.0)
      rexml (>= 3.2.5, < 4.0)
      rubocop-ast (>= 1.28.1, < 2.0)
      ruby-progressbar (~> 1.7)
      unicode-display_width (>= 2.4.0, < 3.0)
    rubocop-ast (1.29.0)
      parser (>= 3.2.1.0)
    ruby-progressbar (1.13.0)
    stringio (3.0.8)
    unicode-display_width (2.4.2)

PLATFORMS
  arm64-darwin-22

DEPENDENCIES
  psych (= 4.0.3)
  rubocop

BUNDLED WITH
   2.4.18

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the bundle exec entry point and the auto_install configuration described in the issue, reproducing the failure with the provided Gemfile and Gemfile.lock using psych 4.0.3. Trace how installation and runtime activation interact; done means the first bundle exec rubocop --version succeeds without the activated psych version conflict.

Written by the indexing model from the issue text.

Assessment

Tech stack
ruby
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.