From: mame@... Date: 2021-05-25T16:20:47+00:00 Subject: [ruby-core:104041] [Ruby master Feature#17883] Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile Issue #17883 has been updated by mame (Yusuke Endoh). jeremyevans0 (Jeremy Evans) wrote in #note-16: > I'm against this in the strongest possible terms. There are more ruby scripts not using bundler than there are ruby applications using bundler. We should not force the usage of bundler and require users to opt-out of it. We should use an opt-in approach. Okay, thanks. As far as I know, most Ruby projects that are maintained are using bundler, but I trust you more than myself (I'm not kidding). In regard to the original issue, I think it can be fixed on the rubygems/bundler side. I'll try to create a pull request to the upstream later. I close this ticket. @eregon Please open another ticket about the priority of RUBYOPT and command-line arguments if you need. @jeremyevans0 I'm still a bit negative to RUBYEARLYOPT unless it is really needed. I'm afraid if introducing it may bring a new hassle in future, such as "I need a way to insert `-rmylib` before `-rbundler/setup`!" But if you think you need it, please open another ticket. Thank you all for the discussion. ---------------------------------------- Feature #17883: Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile https://bugs.ruby-lang.org/issues/17883#change-92179 * 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: