Elenco delle gemme installate?


142

Esiste un metodo Ruby che posso chiamare per ottenere l'elenco delle gemme installate?

Voglio analizzare l'output di gem list. C'è un modo diverso per farlo?

Risposte:


55

Il comando Gem è ora incluso in Ruby 1.9+ ed è un'aggiunta standard a Ruby pre-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

Ecco un modo aggiornato per ottenere un elenco:

require 'rubygems'

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

Perché local_gemssi basa su group_by, restituisce un hash delle gemme, dove la chiave è il nome della gemma e il valore è una matrice delle specifiche della gemma. Il valore è una matrice delle istanze di quella gemma installata, ordinate per numero di versione.

Ciò rende possibile fare cose come:

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]

E:

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

L'ultimo esempio è simile alla gem query --localriga di comando, solo tu hai accesso a tutte le informazioni per una specifica specifica di gemma.


2
Va notato che "Dependency.new w / a regexp è deprecato" ora.
Martin Poljak l'

351

Questo elenca tutte le gemme che ho installato.

gem query --local

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

Vedi 2.7 Elenco di tutte le gemme installate


37
Quando guardo i voti positivi, questa risposta è ciò che la maggior parte delle persone voleva. :)
Kaiser

4
c'è una risposta migliore nella domanda stessa gem list.
Blueray,

gem listfatto esattamente ciò di cui avevo bisogno, ed è molto più semplice e facile da ricordare quando si è nella CLI. Perché così tanti comandi per fare una cosa?
Dave Everitt,

28

Tutti e due

gem query --local

e

 ruby -S gem list --local

elenca 69 voci

Mentre

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

mi dà 82

Ero solito wc -lottenere i numeri. Non sono sicuro se questo è il modo giusto per verificare. Ho cercato di reindirizzare l'output su file di testo e diffondere ma ciò non ha aiutato - dovrà confrontare manualmente uno per uno.


1
Il motivo è semplice Il primo comando aggiunge solo 1 voce per gemma ed elenca le versioni tra parentesi sulla stessa riga. L'ultimo rubycomando elenca ogni versione gem su una riga separata. Per esempio: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)contro sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
kaiser

10

C'è stato un metodo per questo da secoli:

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

ruby -e 'mette Gem :: Specification.all_names' mi dà "-e: 1: costante non inizializzata Gem (NameError)" Come posso risolvere?
Metahuman,

6
Gem::Specification.map {|a| a.name}

Tuttavia, se l'app utilizza Bundler restituirà solo un elenco di gemme locali dipendenti . Per installare tutto:

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

Questo dà NoMethodError: undefined method qualsiasi? per zero: NilClass` quando lo uso (in a rails console).
iconoclasta


3

Una versione più moderna sarebbe usare qualcosa di simile al seguente ...

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

NOTA: molto simile alla prima parte di una risposta di Evgeny ... ma a causa della formattazione della pagina, è facile perdere.


3

Ecco un one-liner davvero bello per stampare tutte le gemme insieme alla loro versione, homepage e descrizione:

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


1

Forse puoi ottenere i file (gemme) dalla directory gemme?

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

1

Dall'interno del tuo tipo di debugger $LOAD_PATHper ottenere un elenco delle tue gemme. Se non si dispone di un debugger, installare pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Questo produrrà una serie di gemme installate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.