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?
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:
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.
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
gem list.
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?
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.
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
C'è stato un metodo per questo da secoli:
ruby -e 'puts Gem::Specification.all_names'
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
NoMethodError: undefined method qualsiasi? per zero: NilClass` quando lo uso (in a rails console).
usa questo codice (in modalità console):
Gem::Specification.all_names
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.
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
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.