Lista de gemas instaladas?

142

¿Hay algún método de Ruby al que pueda llamar para obtener la lista de gemas instaladas?

Quiero analizar la salida de gem list. ¿Hay una manera diferente de hacer esto?

Prakash Raman
fuente

Respuestas:

55

El comando Gem se incluye ahora con Ruby 1.9+, y es una adición estándar 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

Aquí hay una forma actualizada de obtener una lista:

require 'rubygems'

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

Porque local_gemsdepende degroup_by , devuelve un hash de las gemas, donde la clave es el nombre de la gema, y ​​el valor es una matriz de las especificaciones de la gema. El valor es una matriz de las instancias de esa gema que está instalada, ordenada por el número de versión.

Eso hace posible hacer cosas como:

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]

Y:

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

El último ejemplo es similar a la gem query --locallínea de comandos, solo usted tiene acceso a toda la información para la especificación de una gema en particular.

el hombre de hojalata
fuente
2
Debe notarse, "Dependency.new w / a regexp está en desuso" ahora.
Martin Poljak
351

Esto enumera todas las gemas que he instalado.

gem query --local

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

Ver 2.7 Listado de todas las gemas instaladas

frankstuner
fuente
37
Cuando miro los votos a favor, esta respuesta es lo que la mayoría de la gente quería. :)
kaiser
44
Hay una mejor respuesta en la pregunta misma gem list.
blueray
gem listhice exactamente lo que necesitaba, y es mucho más simple y fácil de recordar cuando estoy en la CLI. ¿Por qué tantos comandos para hacer una cosa?
Dave Everitt
28

Ambos

gem query --local

y

 ruby -S gem list --local

lista 69 entradas

Mientras

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

me da 82

Solía wc -lobtener los números. No estoy seguro si esa es la forma correcta de verificar. Intenté redirigir la salida a archivos de texto y diferencié, pero eso no ayudó, tendrá que comparar manualmente uno por uno.

Roobie
fuente
1
El motivo es simple. El primer comando solo agrega 1 entrada por gema y enumera las versiones entre paréntesis en la misma línea. El último rubycomando enumera cada versión de gema en una línea separada. Por ejemplo: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)vs sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
Kaiser
10

Ha habido un método para esto por años:

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

fuente
ruby -e 'pone Gem :: Specification.all_names' me da "-e: 1: Gema constante no inicializada (NameError)" ¿Cómo resuelvo esto?
Metahuman
6
Gem::Specification.map {|a| a.name}

Sin embargo, si su aplicación usa Bundler, solo devolverá una lista de gemas locales dependientes . Para tener todo instalado:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
Evgenii
fuente
¿Esto le da NoMethodError: undefined method algo? para nil: NilClass` cuando lo uso (en a rails console).
iconoclasta
4

use este código (en modo consola):

Gem::Specification.all_names
Игорь Хлебников
fuente
puedes mejorar tu respuesta?
MZaragoza
mejorado o hágame saber exactamente qué no le gusta en mi respuesta
Игорь Хлебников
3

Una versión más moderna sería usar algo similar a lo siguiente ...

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

NOTA: muy similar a la primera parte de una respuesta de Evgeny ... pero debido al formato de página, es fácil pasarla por alto.

paul.belt
fuente
3

Aquí hay una línea muy agradable para imprimir todas las gemas junto con su versión, página de inicio y descripción:

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
fuente
2

Pruébalo en la terminal:

ruby -S gem list --local
Kurt Russell
fuente
1
Tenga en cuenta que el OP quería un método Ruby .
The Tin Man
1

¿Quizás pueda obtener los archivos (gemas) del directorio de gemas?

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

Desde su tipo de depurador $LOAD_PATHpara obtener una lista de sus gemas. Si no tiene un depurador, instale palanca:

gem install pry
pry
Pry(main)> $LOAD_PATH

Esto generará una matriz de sus gemas instaladas.

Nicolai Robles
fuente