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?

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 = "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]

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.


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


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.


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'

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

¿Esto le da NoMethodError: undefined method algo? para nil: NilClass` cuando lo uso (en a rails console).
iconoclasta


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.


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


1

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

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.