176 votes

Liste des gemmes installées?

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 . J'espérais trouver un moyen différent de le faire.

Merci.

408voto

frankstuner Points 955

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

 gem query --local
 

http://docs.rubygems.org/read/chapter/2

Voir 2.7 Liste de toutes les gemmes installées

59voto

the Tin Man Points 69148

Le Joyau de commande est inclus avec Ruby 1.9+ maintenant, et est un standard de plus de Rubis 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 mise à jour de façon à 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 qu' local_gems s'appuie sur group_by, il retourne la valeur de hachage de pierres précieuses, dont la clé est le joyau de la nom, et la valeur est un tableau de la gemme cahier des charges. La valeur est un tableau d'instances de ce joyau qui est installé, triés 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 = "david@loudthinking.com"
#       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 à l' gem query --local de la ligne de commande, vous avez accès à toutes les informations pour un bijou particulier de la spécification.

31voto

Roobie Points 109

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'ed mais cela n'a pas aidé - devra comparer manuellement un par un.

11voto

Barry Points 569

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

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

7voto

Evgeny Points 2765
 Gem::Specification.map {|a| a.name}
 

Toutefois, si votre application utilise Bundler, elle ne renvoie 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X