Kurulu mücevherlerin listesi?


142

Yüklü mücevherlerin listesini almak için arayabileceğim bir Ruby yöntemi var mı?

Çıktısını ayrıştırmak istiyorum gem list. Bunu yapmanın farklı bir yolu var mı?

Yanıtlar:


55

Gem komutu şimdi Ruby 1.9+ ile birlikte gelir ve Ruby 1.9 öncesi için standart bir ektir.

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

İşte bir liste almanın güncellenmiş bir yolu:

require 'rubygems'

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

Çünkü local_gemsgüvendiği için group_by, değerli taşların bir karmasını döndürür, burada anahtarın mücevher adı ve değer değerli taş özelliklerinin bir dizisidir. Değer, yüklü olan bu cevher örneğinin sürüm numarasına göre sıralanmış bir dizisidir.

Bu, aşağıdaki gibi şeyleri yapmayı mümkün kılar:

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]

Ve:

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

Son örnek gem query --localkomut satırına benzer , yalnızca belirli bir gem spesifikasyonu için tüm bilgilere erişebilirsiniz.


2
Şimdi "Bağımlılık.Yeni bir normal ifade w / kaldırıldı" belirtilmelidir.
Martin Poljak


28

Her ikisi de

gem query --local

ve

 ruby -S gem list --local

69 girişi listele

Süre

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

bana 82 verir

Kullandığım wc -lrakamları elde etmek. Kontrol etmenin doğru yolu olduğundan emin değilim. Çıktıyı metin dosyalarına yönlendirmeye çalıştı ve dağıldı, ancak bu yardımcı olmadı - tek tek manuel olarak karşılaştırılması gerekecek.


1
Nedeni basit. İlk komut, her taş için sadece 1 giriş ekler ve sürümleri aynı satırdaki parantez içinde listeler. Son rubykomut, her gem sürümünü ayrı bir satırda listeler. İçin örnek: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)vs sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
kaiser

10

Bunun için çağlar boyunca bir yöntem var:

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

ruby -e 'Gem koyar :: Specification.all_names' bana verir "-e: 1: başlatılmamış sabit Gem (NameError)" Bunu nasıl çözebilirim?
Metahuman

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

Ancak, uygulamanız Bundler kullanıyorsa, yalnızca bağımlı yerel mücevherlerin listesini döndürür . Tümünü yüklemek için:

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

Bu NoMethodError: undefined method herhangi bir şey verir mi? ' Nil için: kullandığımda NilClass` (a rails console).
iconoclast


3

Daha modern bir versiyon, aşağıdakine benzer bir şey kullanmak olacaktır ...

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

NOT: Evgeny'nin cevabının ilk kısmı çok benzer ... ancak sayfa biçimlendirmesi nedeniyle kaçırmak kolaydır.


3

İşte tüm Mücevherleri sürümleri, ana sayfaları ve açıklamaları ile birlikte yazdırmak için gerçekten güzel bir tek astar:

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

Belki gems dizininden dosyaları (gems) alabilirsiniz?

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

1

Hata ayıklayıcı türü içinden $LOAD_PATHdeğerli taşlarınızın bir listesini almak için. Hata ayıklayıcı yoksa, gözetleme yükleyin:

gem install pry
pry
Pry(main)> $LOAD_PATH

Bu, kurulu mücevherlerinizin bir dizisini çıktılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.