Lista zainstalowanych klejnotów?


142

Czy istnieje metoda Ruby, którą mogę wywołać, aby uzyskać listę zainstalowanych klejnotów?

Chcę przeanalizować dane wyjściowe gem list. Czy można to zrobić w inny sposób?

Odpowiedzi:


55

Polecenie Gem jest teraz dołączone do Rubiego 1.9+ i jest standardowym dodatkiem do Rubiego przed wersją 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

Oto zaktualizowany sposób uzyskania listy:

require 'rubygems'

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

Ponieważ local_gemsopiera się na group_by, zwraca skrót klejnotów, gdzie kluczem jest nazwa klejnotu, a wartością jest tablica specyfikacji klejnotów. Wartość to tablica instancji zainstalowanego klejnotu posortowana według numeru wersji.

Dzięki temu można robić takie rzeczy, jak:

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]

I:

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

Ostatni przykład jest podobny do gem query --localwiersza poleceń, tylko że masz dostęp do wszystkich informacji dotyczących specyfikacji konkretnego klejnotu.


2
Należy zauważyć, że „Dependency.new z wyrażeniem regularnym jest przestarzałe”.
Martin Poljak,

351

Zawiera listę wszystkich klejnotów, które zainstalowałem.

gem query --local

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

Zobacz 2.7. Lista wszystkich zainstalowanych klejnotów


37
Kiedy patrzę na pozytywne głosy, to właśnie tej odpowiedzi chciała większość ludzi. :)
kaiser

4
w samym pytaniu jest lepsza odpowiedź gem list.
blueray

gem listzrobił dokładnie to, czego potrzebowałem, i jest o wiele prostszy i łatwiejszy do przywołania, gdy korzystam z CLI. Dlaczego tak wiele poleceń robi jedną rzecz?
Dave Everitt

28

Obie

gem query --local

i

 ruby -S gem list --local

lista 69 wpisów

Podczas

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

daje mi 82

Zwykłem wc -lzbierać liczby. Nie jestem pewien, czy to właściwy sposób sprawdzenia. Próbowałem przekierować dane wyjściowe do plików tekstowych i porównano, ale to nie pomogło - trzeba będzie ręcznie porównać jeden po drugim.


1
Powód jest prosty. Pierwsze polecenie dodaje tylko 1 wpis do każdego klejnotu i wyświetla wersje w nawiasach w tym samym wierszu. Ostatnie rubypolecenie wyświetla każdą wersję klejnotu w oddzielnym wierszu. Na przykład: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)w porównaniu z sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
Kaiser

10

Jest na to metoda od wieków:

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

ruby -e 'puts Gem :: Specification.all_names' daje mi "-e: 1: niezainicjalizowana stała Gem (NameError)" Jak rozwiązać ten problem?
Metahuman

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

Jeśli jednak Twoja aplikacja korzysta z pakietu Bundler, zwróci tylko listę zależnych lokalnych klejnotów. Aby zainstalować wszystko:

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

To daje NoMethodError: undefined method jakieś? dla nil: NilClass` kiedy go używam (w a rails console).
ikonoklast


3

Bardziej nowoczesna wersja polegałaby na użyciu czegoś podobnego do następującego ...

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

UWAGA: bardzo podobna pierwsza część odpowiedzi Evgeny ... ale ze względu na formatowanie strony łatwo ją przeoczyć.


3

Oto naprawdę ładny, jednowierszowy tekst do wydrukowania wszystkich klejnotów wraz z ich wersją, stroną główną i opisem:

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

Może uda ci się pobrać pliki (klejnoty) z katalogu gems?

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

1

Z poziomu swojego typu debugera, $LOAD_PATHaby uzyskać listę swoich klejnotów. Jeśli nie masz debuggera, zainstaluj pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Spowoduje to wyświetlenie tablicy zainstalowanych klejnotów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.