Is require File.expand_path(..., __FILE__) the best practice?

RubyRequire

Ruby Problem Overview


Is require File.expand_path(..., __FILE__) the best way to require other files within a project?

Ruby Solutions


Solution 1 - Ruby

In Ruby 1.9.2 + require_relative is probably the more correct way to do it.

require was changed to not include your '.' directory for security reasons. require_relative was added to provide a local-file solution for modules relative to your calling script's path.

You can search here on StackOverflow, particularly in "What is require_relative in Ruby?", and the internets and find usage tricks and the why-for messages explaining how it came about.

Solution 2 - Ruby

In Ruby 2.x you can use Kernel#__dir__

Solution 3 - Ruby

Unless you modify $LOAD_PATH, which would be a good idea if you keep loading from the same directory structure, you are stuck doing it that way.

The way I've taken to doing it, to ensure things are as cross-platform as possible, is this:

require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__))

It's a little verbose, but it results in the shortest possible path and the least amount of syntax fluff in most cases.

A more specific example would be:

require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__))

You can combine this with a modification to $LOAD_PATH to simplify things if you're loading a lot of files and do this:

$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__))

require 'example'

Solution 4 - Ruby

In Ruby 1.8.x, where you don't have require_relative in core, File.expand_path(...,__FILE__) won't work.

Suppose __FILE__ == "/home/yourname/foo.rb". File.expand_path("bar.rb",__FILE__) gives "/home/yourname/foo.rb/bar.rb.

What you want is File.expand_path("bar.rb",File.dirname(__FILE__)) which returns "/home/yourname/bar.rb"

You could also get require_relative from the backports gem.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondanView Question on Stackoverflow
Solution 1 - Rubythe Tin ManView Answer on Stackoverflow
Solution 2 - RubySteve BennerView Answer on Stackoverflow
Solution 3 - RubytadmanView Answer on Stackoverflow
Solution 4 - RubyKen BloomView Answer on Stackoverflow