web-dev-qa-db-fra.com

Liste des gemmes installées?

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

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

127
Prakash Raman

La commande Gem est incluse dans Ruby 1.9+ et constitue 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 un moyen mis à 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_gems s'appuie sur group_by, il renvoie un hachage des gems, où la clé est le nom du gem et la valeur est un tableau des spécifications de gem. La valeur est un tableau des instances de cette gem installée, 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 ligne de commande gem query --local. Vous avez uniquement accès à toutes les informations relatives à la spécification d'une gemme.

50
the Tin Man

Cela répertorie tous les joyaux que j'ai installés.

gem query --local

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

Voir 2.7 Liste de tous les joyaux installés

306
frankstuner

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'ai utilisé wc -l pour obtenir les chiffres. Pas sûr que ce soit la bonne façon de vérifier. Je ai essayé de rediriger la sortie vers des fichiers texte et diff 'mais cela n'a pas aidé - vous devrez comparer manuellement un par un.

26
Roobie

Il y a une méthode pour cela depuis des lustres:

Ruby -e 'puts Gem::Specification.all_names'
10
user246672
Gem::Specification.map {|a| a.name}

Cependant, si votre application utilise Bundler, elle ne renverra que la liste des gems locaux dépendants . Pour tout installer:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
5
Evgenii

utilisez ce code (en mode console):

Gem::Specification.all_names

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 l'ignorer.

3
paul.belt

Essayez-le dans le terminal:

Ruby -S gem list --local
2
Kurt Russell

Voici un très sympa one-liner pour imprimer toutes les pierres précieuses avec leur version, page d'accueil et 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
2
Darren Hicks

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

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

Dans votre débogueur, tapez $LOAD_PATH pour obtenir la liste de vos gemmes. Si vous n'avez pas de débogueur, installez le levier:

gem install pry
pry
Pry(main)> $LOAD_PATH

Cela produira un tableau de vos gems installés.

1
Nicolai Robles