Skip to content

Commit 10a9588

Browse files
Improve install advice when some gems are not found
This problem is quite specific to our dev environment, but I guess the fix could be handy for other situations. After merging a change to treat default gems as regular gems, I get this when trying to run `rubocop` on our repo: ``` $ bin/rubocop --only Performance/RegexpMatch Could not find json-2.6.3 in locally installed gems Run `bundle install --gemfile /Users/deivid/code/rubygems/rubygems/tool/bundler/lint_gems.rb` to install missing gems. ``` However, when running the suggested command, nothing changes and I still get the same error: ``` $ bundle install --gemfile /Users/deivid/code/rubygems/rubygems/tool/bundler/lint_gems.rb Using ast 2.4.2 Using bundler 2.4.10 Using json 2.6.3 Using parallel 1.23.0 Using racc 1.7.1 Using parser 3.2.2.3 Using rainbow 3.1.1 Using regexp_parser 2.8.1 Using rexml 3.2.5 Using rubocop-ast 1.29.0 Using ruby-progressbar 1.13.0 Using unicode-display_width 2.4.2 Using rubocop 1.52.1 Using rubocop-performance 1.14.2 Bundle complete! 2 Gemfile dependencies, 14 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. $ bin/rubocop --only Performance/RegexpMatch Could not find json-2.6.3 in locally installed gems Run `bundle install --gemfile /Users/deivid/code/rubygems/rubygems/tool/bundler/lint_gems.rb` to install missing gems. ``` The problem is that our `bin/rubocop` script uses the development version of Bundler (which has the change causing the problem), but the advice recommands the default version of Bundler, which does not yet have the change. This commit changes the advice to recommend to use the same version of Bundler that run into the problem in the first place. So in the above situation you now get: ``` $ bin/rubocop --only Performance/RegexpMatch Could not find json-2.6.3 in locally installed gems Run `/Users/deivid/code/rubygems/rubygems/bundler/exe/bundle install --gemfile /Users/deivid/code/rubygems/rubygems/tool/bundler/lint_gems.rb` to install missing gems. ``` And running that fixes the problem: ``` $ /Users/deivid//rubygems/rubygems/bundler/exe/bundle install --gemfile /Users/deivid/code/rubygems/rubygems/tool/bundler/lint_gems.rb Fetching gem metadata from https://rubygems.org/......... Fetching json 2.6.3 Installing json 2.6.3 with native extensions Bundle complete! 2 Gemfile dependencies, 14 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. ```
1 parent 03222d9 commit 10a9588

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

bundler/lib/bundler/setup.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
Bundler.ui.error e.message
1313
Bundler.ui.warn e.backtrace.join("\n") if ENV["DEBUG"]
1414
if e.is_a?(Bundler::GemNotFound)
15-
suggested_cmd = "bundle install"
15+
suggested_bundle = Gem.loaded_specs["bundler"] ? "bundle" : Bundler::SharedHelpers.bundle_bin_path
16+
suggested_cmd = "#{suggested_bundle} install"
1617
original_gemfile = Bundler.original_env["BUNDLE_GEMFILE"]
1718
suggested_cmd += " --gemfile #{original_gemfile}" if original_gemfile
1819
Bundler.ui.warn "Run `#{suggested_cmd}` to install missing gems."

bundler/lib/bundler/shared_helpers.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,13 @@ def set_env(key, value)
304304
public :set_env
305305

306306
def set_bundle_variables
307+
Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", bundle_bin_path
308+
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
309+
Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
310+
Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__)
311+
end
312+
313+
def bundle_bin_path
307314
# bundler exe & lib folders have same root folder, typical gem installation
308315
exe_file = File.expand_path("../../exe/bundle", __dir__)
309316

@@ -313,11 +320,9 @@ def set_bundle_variables
313320
# bundler is a default gem, exe path is separate
314321
exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION) unless File.exist?(exe_file)
315322

316-
Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
317-
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
318-
Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
319-
Bundler::SharedHelpers.set_env "BUNDLER_SETUP", File.expand_path("setup", __dir__)
323+
exe_file
320324
end
325+
public :bundle_bin_path
321326

322327
def set_path
323328
validate_bundle_path

0 commit comments

Comments
 (0)