2010-07-31 7 views
3

La méthode require de ruby ​​recherchera dans le chemin lib et chargera les premiers fichiers correspondants trouvés si nécessaire. Est-il possible d'imprimer le chemin d'accès au fichier qui sera chargé. Je recherche, idéalement intégré, des fonctionnalités similaires à la commande which dans bash et en espérant que cela soit aussi simple que cela. Merci.Découvrez le fichier que la méthode ruby ​​require devrait charger?

Répondre

3

Je ne connais pas de fonctionnalité intégrée, mais la définition de la vôtre n'est pas difficile. Voici une solution adaptée de this question:

def which(string) 
    $:.each do |p| 
    if File.exist? File.join(p, string) 
     puts File.join(p, string) 
     break 
    end 
    end 
end 

which 'nokogiri' 
#=> /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri 

Explication: $: est une variable prédéfinie. C'est un tableau d'endroits pour rechercher des fichiers que vous pouvez load ou require. La méthode which parcourt chaque chemin à la recherche du fichier sur lequel vous l'avez appelé. S'il trouve une correspondance, il renvoie le chemin du fichier.

Je suppose que vous voulez juste que la sortie soit une seule ligne montrant le chemin complet du fichier required, comme which. Si vous voulez voir également les fichiers de votre fichier required va se charger, quelque chose comme la solution dans la question liée pourrait être plus approprié:

module Kernel 
    def require_and_print(string) 
    $:.each do |p| 
     if File.exist? File.join(p, string) 
     puts File.join(p, string) 
     break 
     end 
    end 
    require_original(string) 
    end 

    alias_method :require_original, :require 
    alias_method :require, :require_and_print 

end 

require 'nokogiri' 
#=> /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/rubygems-update-1.3.5/lib/rbconfig 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/pp 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/sax 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/xpath 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xslt 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/html 
# /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/css 
# /opt/local/lib/ruby1.9/1.9.1/racc/parser.rb 
+0

Merci. J'avais le sentiment que je devrais créer ma propre implémentation. BTW, cela semble seulement fonctionner avec ruby ​​1.9 parce que 1.8 n'inclut pas explicitement les chemins gem individuellement dans $ :. –

1

gem $ qui fichier # (pas de suffixe .rb) est ce que j'utilise ...