From: "vo.x (Vit Ondruch) via ruby-core" Date: 2023-09-22T08:57:42+00:00 Subject: [ruby-core:114872] [Ruby master Feature#19889] Let `Kernel.#require` search for files relative to the current working directory for non ./, ../ relative paths Issue #19889 has been updated by vo.x (Vit Ondruch). In short, this could be the implementation: ~~~ def require_relative(path) $LOAD_PATH.unshift __dir__ require path $LOAD_PATH.shift end ~~~ Anything else breaks is harmful (talking about issues such as #16978 which is related IMHO). ---------------------------------------- Feature #19889: Let `Kernel.#require` search for files relative to the current working directory for non ./, ../ relative paths https://bugs.ruby-lang.org/issues/19889#change-104722 * Author: sawa (Tsuyoshi Sawada) * Status: Feedback * Priority: Normal ---------------------------------------- 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. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/