From: mame@...
Date: 2021-05-25T09:14:39+00:00
Subject: [ruby-core:104021] [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).
deivid (David Rodr�guez) wrote in #note-6:
> Would it be enough to check whether `-rbundler/setup` is included in `RUBYOPT`?
I think it is a possible design choice, though it is very hacky.
But in the first place, I think Bundler no longer has to use the RUBYOPT hack because it is integrated with rubygems. What do you think about this proof-of-concept patch for rubygems?
```diff
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 4b867c55e9..a565e09999 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -33,7 +33,15 @@ module Kernel
# The normal require functionality of returning false if
# that file has already been loaded is preserved.
+ @@bundler_setup = true
def require(path)
+ if ENV["BUNDLE_BIN_PATH"] && @@bundler_setup
+ @@bundler_setup = false
+ gem_original_require("bundler/setup")
+ monitor_owned = false
+ return require(path)
+ end
+
if RUBYGEMS_ACTIVATION_MONITOR.respond_to?(:mon_owned?)
monitor_owned = RUBYGEMS_ACTIVATION_MONITOR.mon_owned?
end
```
----------------------------------------
Feature #17883: Load bundler/setup earlier to make `bundle exec ruby -r` respect Gemfile
https://bugs.ruby-lang.org/issues/17883#change-92159
* 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: