2010-09-15 15 views
2

Pendant un certain temps, xml-simple gem avait travaillé pour moi très bien (indirectement, grâce à une autre gemme).Empêcher gem A à partir de méthodes de remplacement de la gem B sans rapport B

Mais récemment, j'ai dû installer Amazon S3 gem aussi. Les gars d'Amazon avaient décidé que xml-simple n'était pas assez cool, ils ont donc fourni un remplacement: 'faster-xml-simple'. Ils ont également décidé que tout le monde veut utiliser leur code maintenant, ils l'ont fait:

class XmlSimple # :nodoc: 
    def self.xml_in(*args) 
    FasterXmlSimple.xml_in *args 
    end 
end 

Mais deux pierres précieuses diffèrent largement dans le comportement et les options. Et maintenant, chaque fois que j'appelle XmlSimple.xml_in, je vais à la version d'Amazon.

Existe-t-il un moyen d'arrêter la gemme A (amazon S3) à partir des méthodes de substitution de la gemme B (xml-simple)? Ou faire les changements d'Amazon vu seulement aux gemmes d'Amazon? Par exemple, lorsqu'il est déployé sur Heroku, tout fonctionne très bien.

Merci!

+0

Je pense que le phénomène est appelé monkeypatching. –

+0

@Andrew Voulez-vous dire, nous devons apprendre à vivre avec? –

+0

Je ne sais pas - je ne fais que mentionner le concept pour qu'il soit plus facile de le google. –

Répondre

3

Ruby a des classes ouvertes, ce qui signifie que n'importe qui peut modifier n'importe quelle classe à tout moment. Il n'y a aucun moyen d'empêcher cela. Et des problèmes comme celui que vous décrivez sont exactement la raison pour laquelle chaque manuel, chaque tutoriel, chaque cours, chaque FAQ enseigne pas pour ce faire. Au cours des 10 dernières années, il a été question d'ajouter espaces de noms de sélecteurs à Ruby 2.0, pour fournir des correctifs de singe de portée lexicale. Plus récemment, matz a jeté son dévolu sur classboxes. Il semble très probable que Ruby 2.0 fournisse des classboxs pour limiter la portée du patch de singe, mais jusque là, votre meilleur pari est de déposer un bug avec l'auteur de cette bibliothèque.