From: Intransition Date: 2009-11-24T09:09:42+09:00 Subject: Re: RubyGems current load paths On Nov 23, 5:38 pm, Eric Hodel wrote: > On Nov 20, 2009, at 08:40, Intransition wrote: > > > I need to get a list of the "current" gem load paths. I learned that I > > can get a list of all the latest load paths via: > > >  Gem.latest_load_paths > > > which is great. But lets say I specify an older version of a lib, eg: > > >  gem "RubyInline", "= 3.7.0" > > > Gem.latest_load_paths doesn't change. How can I get a list of latest > > load paths but adjusted to reflect any specified gem versions? > > Gem.latest_load_paths works for all installed gems, even if they're   > not activated.  You'll need to use Gem::Specification#full_gem_path   > and Gem::Specification#require_path. > > Needing to know where the gem lives is a sign that you're doing   > something wrong though. I'm doing a little meta-programming in this case -- I've created a function to find "plugins". So I need to search through the $LOAD_PATH and Gems. But I'm all ears if there is another way to do it. Here's the code: # = Plugin Handler # # Find plugins across various library managers. # module Plugin extend self DIRECTORY = 'plugin' # Find plugins, searching through standard $LOAD_PATH, # Roll Libraries and RubyGems. # # Provide a +match+ file glob to find plugins. # # Plugins.find('syckle/*') # def find(match) plugins = [] # Standard $LOAD_PATH $LOAD_PATH.uniq.each do |path| list = Dir.glob(File.join(path, DIRECTORY, match)) #dirs = dirs.select{ |d| File.directory?(d) } list = list.map{ |d| d.chomp('/') } plugins.concat(list) end # ROLL (load latest or current versions only) if defined?(::Roll) ::Roll::Library.ledger.each do |name, lib| lib = lib.sort.first if Array===lib lib.load_path.each do |path| find = File.join(lib.location, path, DIRECTORY, match) list = Dir.glob(find) list = list.map{ |d| d.chomp('/') } plugins.concat(list) end end end # RubyGems (load latest versions only) # TODO: need current versions if defined?(::Gem) Gem.latest_load_paths do |path| list = Dir.glob(File.join(path, DIRECTORY, match)) list = list.map{ |d| d.chomp('/') } plugins.concat(list) end end plugins end # Shortcut for #find. # # Plugins['syckle/*'] # alias_method :[], :find end Also, I wonder how Ruby 1.9 might effect this. Are the latest gem paths added to the $LOAD_PATH by default in 1.9?