ActiveSupport
, for example, provides a
large number of useful utilities that, while they function together,
can also function separately.
If I add require active_support
to my code I load all of
ActiveSupport
. While this may be what I want in some cases (like inside
a Rails application) in other cases I may just want a specific piece
of ActiveSupport
. Luckily, ActiveSupport
is designed to handle this
well. If I, for instance, add require active_support/core_ext
I will
only be loading the Ruby core extensions that are a part of ActiveSupport
.
How can you make this work in your library? It's quite simple: your base file should, when required, require all the other parts of your library. However, each part of your library should, at its top, require any other parts or external dependencies so that it may be included without the user having previously required the base file. Let's take a look at an example:
# in lib/my_gem.rb require 'my_gem/widget' require 'my_gem/widgets/foo_bar' require 'my_gem/widgets/baz'
# in lib/my_gem/widget.rb require 'external_library' module MyGem class Widget end end
# in lib/my_gem/widgets/foo_bar require 'my_gem/widget' module MyGem module Widgets class FooBar < MyGem::Widget end end endEach of the files in the above example can be required independently, giving developers the flexibility to use only a subset of your library's functionality if needed.
Remember that require
statements will only
load the code from a file once, so it is safe to require
the same file
multiple times.
Casiano Rodriguez León 2015-01-07