Lista de gemas instaladas?


141

Existe um método Ruby que eu possa chamar para obter a lista de gemas instaladas?

Eu quero analisar a saída de gem list. Existe uma maneira diferente de fazer isso?

Respostas:


55

O comando Gem está incluído no Ruby 1.9+ agora e é uma adição padrão ao Ruby 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

Aqui está uma maneira atualizada de obter uma lista:

require 'rubygems'

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

Como local_gemsdepende group_by, ele retorna um hash das gemas, onde a chave é o nome da gema e o valor é uma matriz das especificações da gema. O valor é uma matriz das instâncias dessa gema instalada, classificadas pelo número da versão.

Isso torna possível fazer coisas 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]

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

O último exemplo é semelhante à gem query --locallinha de comando, apenas você tem acesso a todas as informações para a especificação de uma gema específica.


2
Deve-se notar, "Dependency.new w / a regexp está obsoleto" agora.
Martin Poljak

351

Isso lista todas as jóias que eu instalei.

gem query --local

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

Veja 2.7 Listando todas as gemas instaladas


37
Quando olho para os votos positivos, essa resposta é o que a maioria das pessoas queria. :)
Kaiser

4
há uma resposta melhor na própria pergunta gem list.
BlueRay

gem listfiz exatamente o que eu precisava, e é muito mais simples e fácil de lembrar quando estou na CLI. Por que tantos comandos para fazer uma coisa?
Dave Everitt

28

Ambos

gem query --local

e

 ruby -S gem list --local

lista 69 entradas

Enquanto

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

me dá 82

Eu costumava wc -lpegar os números. Não tenho certeza se essa é a maneira correta de verificar. Tentou redirecionar a saída para arquivos de texto e diferenciou, mas isso não ajudou - precisará comparar manualmente um por um.


1
O motivo é simples. O primeiro comando adiciona apenas 1 entrada por gema e lista as versões entre parênteses na mesma linha. O último rubycomando lista cada versão da gema em uma linha separada. Para, por exemplo: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)x sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
Kaiser

10

Há um método para isso há muito tempo:

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

ruby -e 'coloca Gem :: Specification.all_names' me fornece "-e: 1: constante não inicializada Gem (NameError)" Como faço para resolver isso?
Metahuman #

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

No entanto, se seu aplicativo usar o Bundler, ele retornará apenas a lista de gemas locais dependentes . Para instalar tudo:

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

Isso dá NoMethodError: undefined method alguma? para nil: NilClass` quando eu o uso (em a rails console).
Iconoclast


3

Uma versão mais moderna seria usar algo semelhante ao seguinte ...

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

NOTA: muito semelhante à primeira parte de uma resposta da Evgeny ... mas devido à formatação da página, é fácil perder.


3

Aqui está uma ótima linha para imprimir todas as gemas, juntamente com sua versão, página inicial e descrição:

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

Talvez você possa obter os arquivos (gems) no diretório gems?

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

1

De dentro do seu tipo de depurador $LOAD_PATHpara obter uma lista de suas jóias. Se você não possui um depurador, instale o alavanca:

gem install pry
pry
Pry(main)> $LOAD_PATH

Isso produzirá uma matriz de suas gemas instaladas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.