From: deivid.rodriguez@... Date: 2021-05-25T07:13:39+00:00 Subject: [ruby-core:104020] [Ruby master Feature#17883] Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile Issue #17883 has been updated by deivid (David Rodr�guez). Indeed @mame, good catch. It sounds like this can't really be fixed in general inside bundler. In my opinion, making handling of RUBYOPT consistent as suggested by @Eregon would be the best way to fix this. I can see it could cause issues in some cases, but they should be pretty rare because it needs users to be using `-r` both in `RUBYOPT` and as CLI args at the same time, which I believe is not very common. And not only that, it needs to be some usage that doesn't hit this particular issue. So in my opinion, while maybe not worth fixing on a patch level release, I'd say it could go into the next major version with a proper note in the changelog. If the preferred way to fix it is to add a special case (specifically requiring `bundler/setup`) to the current special case (`-r` handling), do we need to check a bundler specific environment variable? Would it be enough to check whether `-rbundler/setup` is included in `RUBYOPT`? ---------------------------------------- Feature #17883: Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile https://bugs.ruby-lang.org/issues/17883#change-92157 * Author: mame (Yusuke Endoh) * Status: Open * Priority: Normal ---------------------------------------- To reproduce the issue, prepare a Gemfile and run `bundle install --path=vendor/bundle`. ``` $ cat Gemfile source "https://rubygems.org" gem "activesupport" $ bundle install --path=vendor/bundle ``` `Kernel#require` respects the Gemfile correctly. ``` $ bundle exec ruby -e 'require "active_support"' ``` However, `bundle exec ruby -ractive_support -e ''` does not. ``` $ bundle exec ruby -ractive_support -e '' :85:in `require': cannot load such file -- active_support (LoadError) from :85:in `require' ``` We can work around the issue by explicitly passing `-rbundler/setup` before `-ractive_support`, but this is very confusing to me. The same issue was discussed in StackOverflow: https://stackoverflow.com/questions/59623068/correct-way-to-combine-bundle-exec-and-ruby-r --- Here is my analysis. `bundle exec` sets `RUBYOPT=-rbundler/setup` which replaces `Kernel#require` with bundler's own definition. `-e 'require "active_support"'` correctly triggers bundler's definition. However, `-ractive_support` is evaluated before `RUBYOPT=-rbundler/setup` is evaluated, so it triggers rubygems' require definition which does not know `vendor/bundle` directory. This is caused by the interpretation order of `RUBYOPT` and command-line arguments. ``` $ RUBYOPT=-r./a ruby -r./b -e '' :b :a ``` For compatibility, I don't think that changing the order is a good idea. IMO, it would be good for ruby interpreter to provide Bundler something special, because Bundler is now bundled with Ruby. My naive idea is to make the interpreter load `ENV["BUNDLE_BIN_PATH"] + "../../lib/bundler/setup"` before any other `-r` options if `BUNDLE_BIN_PATH` is defined. Or another new dedicated environment variable that `bundle exec` sets may work (for example, `RUBY_BUNDLER_SETUP` or something). @deivid @nobu What do you think? -- https://bugs.ruby-lang.org/ Unsubscribe: