Liste des gemmes installées?

142

Existe-t-il une méthode Ruby que je peux appeler pour obtenir la liste des gemmes installées?

Je veux analyser la sortie de gem list. Y a-t-il une manière différente de faire cela?

Prakash Raman
la source

Réponses:

55

La commande Gem est désormais incluse avec Ruby 1.9+, et est un ajout standard à Ruby pré-1.9.

require 'rubygems'

name = /^/i
dep = Gem::Dependency.new(name, Gem::Requirement.default)
specs = Gem.source_index.search(dep)
puts specs[0..5].map{ |s| "#{s.name} #{s.version}" }
# >> Platform 0.4.0
# >> abstract 1.0.0
# >> actionmailer 3.0.5
# >> actionpack 3.0.5
# >> activemodel 3.0.5
# >> activerecord 3.0.5

Voici une méthode mise à jour pour obtenir une liste:

require 'rubygems'

def local_gems
   Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name }
end

Parce que local_gemss'appuie sur group_by, il renvoie un hachage des gemmes, où la clé est le nom du gemme et la valeur est un tableau des spécifications de gemmes. La valeur est un tableau des instances de ce gem qui est installé, triées par numéro de version.

Cela permet de faire des choses comme:

my_local_gems = local_gems()

my_local_gems['actionmailer']
# => [Gem::Specification.new do |s|
#       s.authors = ["David Heinemeier Hansson"]
#       s.date = Time.utc(2013, 12, 3)
#       s.dependencies = [Gem::Dependency.new("actionpack",
#         Gem::Requirement.new(["= 4.0.2"]),
#         :runtime),
#        Gem::Dependency.new("mail",
#         Gem::Requirement.new(["~> 2.5.4"]),
#         :runtime)]
#       s.description = "Email on Rails. Compose, deliver, receive, and test emails using the familiar controller/view pattern. First-class support for multipart email and attachments."
#       s.email = "[email protected]"
#       s.homepage = "http://www.rubyonrails.org"
#       s.licenses = ["MIT"]
#       s.name = "actionmailer"
#       s.require_paths = ["lib"]
#       s.required_ruby_version = Gem::Requirement.new([">= 1.9.3"])
#       s.requirements = ["none"]
#       s.rubygems_version = "2.0.14"
#       s.specification_version = 4
#       s.summary = "Email composition, delivery, and receiving framework (part of Rails)."
#       s.version = Gem::Version.new("4.0.2")
#       end]

Et:

puts my_local_gems.map{ |name, specs| 
  [ 
    name,
    specs.map{ |spec| spec.version.to_s }.join(',')
  ].join(' ') 
}
# >> actionmailer 4.0.2
...
# >> arel 4.0.1,5.0.0
...
# >> ZenTest 4.9.5
# >> zucker 13.1

Le dernier exemple est similaire à la gem query --localligne de commande, vous seul avez accès à toutes les informations pour la spécification d'un gem particulier.

l'homme d'étain
la source
2
Il faut noter que "Dependency.new w / a regexp est obsolète" maintenant.
Martin Poljak
351

Cela répertorie toutes les gemmes que j'ai installées.

gem query --local

http://guides.rubygems.org/command-reference/#gem-list

Voir 2.7 Liste de tous les gemmes installés

Frankstuner
la source
37
Quand je regarde les votes positifs, alors cette réponse est ce que la plupart des gens voulaient. :)
kaiser
4
il y a une meilleure réponse dans la question elle-même gem list.
blueray du
gem lista fait exactement ce dont j'avais besoin, et c'est beaucoup plus simple et plus facile à rappeler sur la CLI. Pourquoi tant de commandes pour faire une chose?
Dave Everitt
28

Tous les deux

gem query --local

et

 ruby -S gem list --local

liste 69 entrées

Tandis que

ruby -e 'puts Gem::Specification.all_names'

me donne 82

J'avais l'habitude wc -ld'obtenir les chiffres. Je ne sais pas si c'est la bonne façon de vérifier. J'ai essayé de rediriger la sortie vers des fichiers texte et diff'ed mais cela n'a pas aidé - devra comparer manuellement un par un.

Roobie
la source
1
La raison est simple. La première commande n'ajoute qu'une seule entrée par gemme et répertorie les versions entre parenthèses sur la même ligne. La dernière rubycommande répertorie chaque version de gem sur une ligne distincte. Par exemple: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)contre sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
kaiser
10

Il existe une méthode pour cela depuis des lustres:

ruby -e 'puts Gem::Specification.all_names'

la source
ruby -e 'met Gem :: Specification.all_names' me donne "-e: 1: constante non initialisée Gem (NameError)" Comment résoudre ce problème?
Metahuman
6
Gem::Specification.map {|a| a.name}

Cependant, si votre application utilise Bundler, elle ne renverra que la liste des gemmes locales dépendantes . Pour tout installer:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
Evgenii
la source
Cela en donne NoMethodError: undefined method ? pour nil: NilClass` quand je l'utilise (en a rails console).
iconoclaste le
4

utilisez ce code (en mode console):

Gem::Specification.all_names
Игорь Хлебников
la source
pouvez-vous améliorer votre réponse?
MZaragoza du
amélioré ou dites-moi ce que vous n'aimez pas exactement dans ma réponse
Игорь Хлебников
3

Une version plus moderne consisterait à utiliser quelque chose qui ressemble à ce qui suit ...

require 'rubygems'
puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') }

NOTE: très similaire la première partie d'une réponse d'Evgeny ... mais en raison du formatage de la page, il est facile de la rater.

paul.belt
la source
3

Voici un très bon one-liner pour imprimer toutes les gemmes avec leur version, leur page d'accueil et leur description:

Gem::Specification.sort{|a,b| a.name <=> b.name}.map {|a| puts "#{a.name} (#{a.version})"; puts "-" * 50; puts a.homepage; puts a.description; puts "\n\n"};nil
Darren Hicks
la source
2

Essayez-le dans le terminal:

ruby -S gem list --local
Kurt Russell
la source
1
Notez que l'OP voulait une méthode Ruby .
the Tin Man
1

Peut-être pouvez-vous obtenir les fichiers (gems) du répertoire gems?

gemsdir = "gems directory"
gems = Dir.new(gemsdir).entries
Fossmo
la source
1

À partir de votre type de débogueur $LOAD_PATHpour obtenir une liste de vos gemmes. Si vous n'avez pas de débogueur, installez pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Cela produira un tableau de vos gemmes installées.

Nicolai Robles
la source