wake-up-neo.com

Liste der installierten Edelsteine?

Gibt es eine Ruby -Methode, mit der ich die Liste der installierten Edelsteine ​​abrufen kann?

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

127
Prakash Raman

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

Weil local_gems beruht auf group_by gibt einen Hash der Edelsteine ​​zurück, wobei der Schlüssel der Name des Edelsteins ist und der Wert ein Array der Edelsteinspezifikationen ist. Der Wert ist ein Array der Instanzen des 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 dem gem query --local Kommandozeile, nur Sie haben Zugriff auf alle Informationen für die Spezifikation eines bestimmten Edelsteins.

50
the Tin Man

Hier sind alle Edelsteine ​​aufgelistet, die ich installiert habe.

gem query --local

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

Siehe 2.7 Auflisten aller installierten Edelsteine

306
frankstuner

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 benutzte wc -l, um die Zahlen zu erhalten. Ich bin mir nicht sicher, ob dies der richtige Weg ist, um dies zu überprüfen. Versucht, die Ausgabe in Textdateien umzuleiten und diff'ed, aber das hat nicht geholfen - muss manuell nacheinander verglichen werden.

26
Roobie

Es gibt schon seit Ewigkeiten eine Methode dafür:

Ruby -e 'puts Gem::Specification.all_names'
10
user246672
Gem::Specification.map {|a| a.name}

Wenn Ihre App jedoch Bundler verwendet, gibt sie nur eine Liste von abhängigen lokalen Edelsteinen zurück. So installieren Sie alle:

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

verwenden Sie diesen Code (im Konsolenmodus):

Gem::Specification.all_names

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: Sehr ähnlich dem ersten Teil einer Antwort von Evgeny ... aber aufgrund der Seitenformatierung ist es leicht zu übersehen.

3
paul.belt

Probieren Sie es im Terminal aus:

Ruby -S gem list --local
2
Kurt Russell

Hier ist ein wirklich netter 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
2
Darren Hicks

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

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

Geben Sie in Ihrem Debugger $LOAD_PATH Ein, um eine Liste Ihrer Edelsteine ​​zu erhalten. Wenn Sie keinen Debugger haben, installieren Sie pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Dadurch wird ein Array Ihrer installierten Edelsteine ​​ausgegeben.

1
Nicolai Robles