Facilitating the Spread of Knowledge and Innovation in Professional Software Development

Write for InfoQ


Choose your language

InfoQ Homepage News RubyGems Gets Plugins

RubyGems Gets Plugins

Leia em Português

This item in japanese

The recently released RubyGems version 1.3.2 is more than just a minor bugfix release, it also contains new features:

As of RubyGems 1.3.2, RubyGems will load plugins installed in gems or $LOAD_PATH. Plugins must be named 'rubygems_plugin' are discovered via Gem::find_files then loaded.

An example comes from Ryan Davis: the Graph plugin generates a graph of the dependencies and information (outdated, incoming dependencies) of your installed Gems.

We talked to RubyGems maintainer Eric Hodel to learn more about the general idea of RubyGems plugins:

The feature request tracker for RubyGems has lots of stuff people want to add, and some of it can be done as a stand-alone package. There's also things you may want to do at install time that otherwise would require manual intervention from the user.

The plugins started with a patch from Neil Wilson to add install hooks to RubyGems for Debian that would make it easier to integrate the two. With his patch we added two special files that RubyGems would try to require at startup, rubygems/defaults/operating_system.rb for ruby packagers and rubygems/defaults/#{RUBY_ENGINE}.rb for ruby implementors to add special functionality. For example, Rubinius could pre-compile all the .rb files in the gem to reduce startup time.

Around the same time I added Gem.find_files that would allow gem authors to easily construct their own plugin system. RDoc uses this to automatically load its plugins.

Since it turned out rather well for RDoc I decided that RubyGems should have the same feature.

I didn't try to make the plugins have a comprehensive way to hook into every possible corner of RubyGems. I'm sure that people will want to hook into areas that aren't currently easy to access, and I hope they submit feature requests against RubyGems to help me find them. It's much easier for me to improve the API a little for a plugin than it is to maintain an entire new feature.

My hope is that creative people will provide amazing and useful things that I don't have to ship or maintain inside RubyGems.

Besides the Graph plugin, there's also rubypan to search and they are working on "a plugin that will create an OS X dictionary from ri data that would be updated whenever you install or uninstall a gem".

Plugin writers can hook into RubyGems pre and post install and uninstall actions, see the Gem Documentation. Writing a plugin for your own command is also straightforward: subclass Command and register it with the Gem::CommandManager.

Do you miss a feature in RubyGems that could now be provided by a plugin?

Rate this Article