¿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?
¿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:
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_gems
depende 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 --local
línea de comandos, solo usted tiene acceso a toda la información para la especificación de una gema en particular.
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
gem list
.
gem list
hice 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?
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 -l
obtener 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.
ruby
comando 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
Ha habido un método para esto por años:
ruby -e 'puts Gem::Specification.all_names'
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
NoMethodError: undefined method
algo? para nil: NilClass` cuando lo uso (en a rails console
).
use este código (en modo consola):
Gem::Specification.all_names
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.
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
Pruébalo en la terminal:
ruby -S gem list --local
Desde su tipo de depurador $LOAD_PATH
para 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.