Feature #19889
closedLet `Kernel.#require` search for files relative to the current working directory for non ./, ../ relative paths
Description
My understanding is that ./
and ../
in the given path argument are interpreted relative to:
(1)
- The current working directory (for
load
orrequire
) - The requiring file's path (for
require_relative
)
which shows a division of labor between the methods, and seems reasonable. However, when it comes to other relative paths (e.g., foo/bar.rb
), they are interpreted relative to:
(2)
- Paths in
$LOAD_PATH
(forrequire
) - Paths in
$LOAD_PATH
or the current working directory (forload
orrequire_relative
)
For example, given:
- File
some_path/foo/a.rb
- File
some_path/b.rb
with contentrequire "foo/a"
- Current directory at
some_path
,
running ruby b.rb
raises a LoadError
, but given:
- File
some_path/foo/a.rb
- File
some_path/b.rb
with contentrequire_relative "foo/a"
- Current directory at
some_path
,
running ruby b.rb
does not raise an error.
The search path in (2) for require
is a proper subset of that of load
and require_relative
. There is no division of labor here; there is only inconvenience for require
.
Furthermore, in (1), require
(as well as load
) is concerned with the current working directory while require_relative
is not, but in (2), the relation is reversed: require_relative
(as well as load
) is concerned with the current working directory while require
is not.
This situation is making the specification of require
versus require_relative
difficult to understand, as well as causing inconvenience.
Proposal: For non-./
-or-../
relative paths, I propose to let Kernel.#require
search relative to the current working directory if the file is not found relative to the paths in $LOAD_PATH
, so that the methods load
, require
, and require_relative
all work the same in this respect.