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.
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?
On Mon, Nov 23, 2009 at 4:09 PM, Intransition [email protected]
wrote:
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.
Have you looked at Gem.find_files? It was written to solve this problem.
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:
On Mon, Nov 23, 2009 at 4:09 PM, Intransition [email protected] wrote:
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.
Have you looked at Gem.find_files? It was written to solve this problem.
Yes, I looked at that. But there is a problem. The docs say,
“Note that find_files will return all files even if they are from
different versions of the same gem.”
I want only the active or latest gem versions.
However, short of a better solution, I guess I can look at the code
behind that method for some ideas.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.