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
end
Each 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