# Loading Source Files

# Require files to be loaded only once

The Kernel#require (opens new window) method will load files only once (several calls to require will result in the code in that file being evaluated only once). It will search your ruby $LOAD_PATH to find the required file if the parameter is not an absolute path. Extensions like .rb, .so, .o or .dll are optional. Relative paths will be resolved to the current working directory of the process.

require 'awesome_print'

The Kernel#require_relative (opens new window) allows you to load files relative to the file in which require_relative is called.

# will search in directory myproj relative to current source file.
#
require_relative 'myproj/version'  

# Automatically loading source files

The method Kernel#autoload (opens new window) registers filename to be loaded (using Kernel::require) the first time that module (which may be a String or a symbol) is accessed.

autoload :MyModule, '/usr/local/lib/modules/my_module.rb' 

The method Kernel#autoload? (opens new window) returns filename to be loaded if name is registered as autoload.

autoload? :MyModule  #=> '/usr/local/lib/modules/my_module.rb'

# Loading optional files

When files are not available, the require family will throw a LoadError (opens new window). This is an example which illustrates loading optional modules only if they exist.

module TidBits

@@unavailableModules = []

[
      { name: 'CoreExtend', file: 'core_extend/lib/core_extend'  } \
    , { name: 'Fs'        , file: 'fs/lib/fs'                    } \
    , { name: 'Options'   , file: 'options/lib/options'          } \
    , { name: 'Susu'      , file: 'susu/lib/susu'                } \

].each do |lib|

    begin

        require_relative lib[ :file ]

    rescue LoadError

        @@unavailableModules.push lib

    end

end

end # module TidBits

# Loading files repeatedly

The Kernel#load (opens new window) method will evaluate the code in the given file. The search path will be constructed as with require. It will re-evaluate that code on every subsequent call unlike require. There is no load_relative.

load `somefile`

# Loading several files

You can use any ruby technique to dynamically create a list of files to load. Illustration of globbing for files starting with test, loaded in alphabetical order.

Dir[ "#{ __dir__ }**/test*.rb" ) ].sort.each do |source|

    require_relative source

end