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
loadorrequire) - 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_PATHor the current working directory (forloadorrequire_relative)
For example, given:
- File
some_path/foo/a.rb - File
some_path/b.rbwith 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.rbwith 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.