Liste der installierten Edelsteine?

141

Gibt es eine Ruby-Methode, die ich aufrufen kann, um die Liste der installierten Edelsteine ​​abzurufen?

Ich möchte die Ausgabe von analysieren gem list. Gibt es einen anderen Weg, dies zu tun?

Prakash Raman
quelle

Antworten:

55

Der Gem-Befehl ist jetzt in Ruby 1.9+ enthalten und eine Standardergänzung zu Ruby vor 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

Hier ist eine aktualisierte Methode, um eine Liste zu erhalten:

require 'rubygems'

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

Da es local_gemssich auf verlässt group_by, wird ein Hash der Edelsteine ​​zurückgegeben, wobei der Schlüssel der Name des Edelsteins ist und der Wert ein Array der Edelsteinspezifikationen ist. Der Wert ist ein Array der Instanzen dieses installierten Gems, sortiert nach der Versionsnummer.

Das macht es möglich, Dinge zu tun wie:

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]

Und:

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

Das letzte Beispiel ähnelt der gem query --localBefehlszeile, nur Sie haben Zugriff auf alle Informationen für die Spezifikation eines bestimmten Edelsteins.

der Blechmann
quelle
2
Sollte beachtet werden, "Dependency.new w / a regexp ist veraltet" jetzt.
Martin Poljak
351

Dies listet alle Edelsteine ​​auf, die ich installiert habe.

gem query --local

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

Siehe 2.7 Auflisten aller installierten Edelsteine

frankstuner
quelle
37
Wenn ich mir die positiven Stimmen ansehe, dann ist diese Antwort das, was die meisten Leute wollten. :)
Kaiser
4
In der Frage selbst gibt es eine bessere Antwort gem list.
Blueray
gem listhat genau das getan, was ich brauchte, und es ist viel einfacher und leichter, sich an die CLI zu erinnern. Warum so viele Befehle, um eine Sache zu tun?
Dave Everitt
28

Beide

gem query --local

und

 ruby -S gem list --local

Liste 69 Einträge

Während

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

gibt mir 82

Ich habe wc -ldie Zahlen bekommen. Ich bin mir nicht sicher, ob dies der richtige Weg ist, um dies zu überprüfen. Versucht, die Ausgabe in Textdateien umzuleiten und unterschied sich, aber das hat nicht geholfen - muss manuell einzeln verglichen werden.

Roobie
quelle
1
Der Grund ist einfach. Der erste Befehl fügt nur 1 Eintrag pro Edelstein hinzu und listet die Versionen in Klammern in derselben Zeile auf. Der letzte rubyBefehl listet jede Edelsteinversion in einer separaten Zeile auf. Für zB: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)gegen sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
kaiser
10

Dafür gibt es seit Ewigkeiten eine Methode:

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

quelle
ruby -e 'setzt Gem :: Specification.all_names' gibt mir "-e: 1: nicht initialisierte Konstante Gem (NameError)" Wie löse ich das?
Metahuman
6
Gem::Specification.map {|a| a.name}

Wenn Ihre App jedoch Bundler verwendet, wird nur eine Liste der abhängigen lokalen Edelsteine ​​zurückgegeben. So installieren Sie alle:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
Evgenii
quelle
Das gibt welche NoMethodError: undefined method ? ' für nil: NilClass` wenn ich es benutze (in a rails console).
Bilderstürmer
4

Verwenden Sie diesen Code (im Konsolenmodus):

Gem::Specification.all_names
Игорь Хлебников
quelle
Kannst du deine Antwort verbessern?
MZaragoza
verbessert oder lassen Sie mich wissen, was genau Sie in meiner Antwort nicht mögen
Игорь Хлебников
3

Eine modernere Version wäre, etwas zu verwenden, das dem folgenden ähnelt ...

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

HINWEIS: Der erste Teil einer Antwort von Evgeny ist sehr ähnlich. Aufgrund der Seitenformatierung ist er jedoch leicht zu übersehen.

paul.belt
quelle
3

Hier ist ein wirklich schöner Einzeiler, um alle Edelsteine ​​zusammen mit ihrer Version, Homepage und Beschreibung zu drucken:

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

Probieren Sie es im Terminal aus:

ruby -S gem list --local
Kurt Russell
quelle
1
Beachten Sie, dass das OP eine Ruby- Methode wollte .
der Blechmann
1

Vielleicht können Sie die Dateien (Edelsteine) aus dem Edelsteinverzeichnis abrufen?

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

In Ihrem Debugger-Typ $LOAD_PATHerhalten Sie eine Liste Ihrer Edelsteine. Wenn Sie keinen Debugger haben, installieren Sie pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Dadurch wird ein Array Ihrer installierten Edelsteine ​​ausgegeben.

Nicolai Robles
quelle