Vérifier Ruby Gem disponibilité
Est-il un moyen de vérifier si certains gem est actuellement installé, via le module Gem? De code ruby, pas par l'exécution de "gem list'...
À préciser - je ne veux pas charger la bibliothèque. Je veux juste vérifier si il est disponible, de sorte que tous les rescue LoadError
solutions ne permettent pas de m'aider. Aussi je ne m'inquiète pas si le bijou en lui-même fonctionne ou pas, seulement si il est installé.
Vous devez vous connecter pour publier un commentaire.
À mon humble avis, le meilleur moyen est d'essayer de charger/exiger du GEM et de sauvetage de l'Exception, Ray a déjà montré. Il est sûr de sauver la LoadError exception car elle n'est pas soulevée par le BIJOU lui-même, mais c'est le comportement standard de l'exiger de commande.
Vous pouvez également utiliser la gemme de commande à la place.
Joyau de la commande a le même comportement de l'exiger de commande, avec quelques légères différences. Autant que je sache, il essaie toujours d'autoload le principal JOYAU de fichier.
De creuser dans le rubygems.rb fichier (ligne 310), j'ai trouvé la suite de l'exécution
Il peut vous fournir quelques conseils sur la façon de faire un gros chèque, sans réellement le chargement de la bibliothèque.
Gem.source_index.find_name('some_name').map {|x| x.name}
- il des retours d'appariement installé gemmes.$ gem list | grep YOURGEM
pour vérifier si la YOURGEM est présent.GEM::LoadError
devrait êtreGem::LoadError
Il y a aussi:
Vous pouvez utiliser les expressions régulières aussi. Pratique si je veux autoriser "rcov" et GitHub variantes comme la "pertinence-rcov':
Gem::available?
est allé. Je te suggère de supprimer cette réponse, ou de l'ajout d'une note, afin d'éviter d'induire en erreur les gens.Regardant Joyau de la documentation de l'API, à l'aide de Gem::Spécification::find_all_by_name pour tester gem disponibilité semble raisonnable.
find_all_by_name
renvoie toujours à un tableau (de la Spécification des objets), par opposition àfind_by_name
qui lève une exception si aucune correspondance n'est trouvée.rescue
. Alternativement, vous pouvez utiliserif
....any?
pour être plus lisible.Depuis Gem.disponible? est déprécié (argh!), vous devez sauver à nouveau (double aaargh). Oui, find_by_name déclenche une exception si le bijou n'est pas trouvé. Donc, pour être rétro-compatible avec les anciens rubygems, la solution semble être :
Noter que la nouvelle méthode permet de transmettre une version spécifique pour voir si c'est chargé:
Vous pouvez:
Ce ne serait pas, cependant, de vous dire si le module a été installé par le gem ou d'autres moyens.
- Je utiliser ce code et cela fonctionne sans problème.
Exemples d'utilisation
Supposons que vous avez rack 1.9.1 installé.