2010-08-11 4 views
19

Existe-t-il un moyen de "recharger" ou "rafraîchir" un rubygem en mémoire? Comme je joue en irb, parfois j'aime modifier mes fichiers gem, et si j'ai besoin de la même gemme, elle ne se met pas à jour en mémoire et donne la sortie "false". Actuellement, je dois quitter la CISR, retourner à la CISR et exiger la gemme à nouveau, il doit y avoir un meilleur moyen ... qu'est-ce que c'est?Recharger rubygem dans IRB

+0

si je devais coder cette fonctionnalité là où elle devrait aller? Rubygems? Cette communauté accepte-t-elle généralement les nouvelles demandes d'extraction de fonctionnalité? – Schneems

Répondre

17

Comme d'autres l'ont suggéré, vous pouvez utiliser Kernel # load. . Cependant, ne perdez pas votre temps à trouver et à charger chaque fichier de pierres précieuses que tous les fichiers qui ont été nécessaires sont stockés dans $ » Armés de cette connaissance, voici une reload irb:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| load(e) } 
end 

Par exemple, si vous utilisaient la pierre précieuse de hirb à irb, vous simplement recharger avec:

>> reload 'hirb' 

Si pour une charge de raison ne fonctionne pas (il est plus pointilleux sur les extensions de fichier que require est), vous pouvez à nouveau besoin d'un fichier par en supprimant d'abord son entrée dans $ ". Avec ce conseil la commande ci-dessus serait:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) } 
end 

Choisissez celui qui fonctionne pour vous. Personnellement, j'utilise ce dernier.

+0

Est-ce que cela fonctionne également pour les scripts inclus dans le système de fichiers? Cela ne fonctionnait pas pour le mien ... et mon instruction require ressemble à ceci: 'require' # {File.expand_path (__ FILE __)} /../lib/ query '' – picardo

+2

Non, non. L'expression rationnelle est trop restrictive - vous devez spécifier le chemin complet. J'ai modifié ma version en remplaçant^par /. – Trejkaz

8

charge 'filename.rb'

un à la fois pour chaque qui a été changé ...

6

Une façon est d'utiliser Kernel#load. Vous pouvez l'utiliser à peu près comme Kernel#require, sauf que vous devez inclure explicitement l'extension de fichier. Cependant, il a ses inconvénients (même quelque chose d'aussi simple que class Foo < Struct.new(:foo); end échoue, car il n'est pas possible de changer la superclasse d'une classe), donc j'aimerais aussi savoir une meilleure façon de le faire.

Dans les rails, vous pouvez réaliser cela avec reload! sur script/console, mais je ne sais pas quel genre de magie ils utilisent.

This gist semble prometteur mais je ne l'ai pas testé.

+0

'reload!' Est seulement supposé charger des choses dans le répertoire 'app /', rien de plus. Il y a aussi des limitations, ce qui explique pourquoi beaucoup de vos classes et contrôleurs apparaissent comme des classes anonymes dans votre environnement de développement, de sorte qu'ils peuvent être éliminés complètement et réinitialisés à chaque requête. – tadman

Questions connexes