Feature #19889
Updated by sawa (Tsuyoshi Sawada) over 1 year ago
My understanding is that `./` and `../` in the given path argument are interpreted relative to:
(1)
* The current working directory (for `load` or `require`)
* 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` (for `require`)
* Paths in `$LOAD_PATH` or **the current working directory** (for `load` or `require_relative`)
For example, given:
* File `some_path/foo/a.rb`
* File `some_path/b.rb` with content `require "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 content ` require_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.