Daftar permata yang diinstal?


142

Apakah ada metode Ruby yang dapat saya hubungi untuk mendapatkan daftar permata yang diinstal?

Saya ingin mengurai output dari gem list. Apakah ada cara berbeda untuk melakukan ini?

Jawaban:


55

Perintah Gem disertakan dengan Ruby 1.9+ sekarang, dan merupakan tambahan standar untuk Ruby pra-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

Berikut cara terbaru untuk mendapatkan daftar:

require 'rubygems'

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

Karena local_gemsbergantung pada group_by, itu mengembalikan hash permata, di mana kuncinya adalah nama permata, dan nilainya adalah array dari spesifikasi permata. Nilai adalah array dari instance permata yang diinstal, diurutkan berdasarkan nomor versi.

Itu memungkinkan untuk melakukan hal-hal seperti:

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]

Dan:

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

Contoh terakhir mirip dengan baris gem query --localperintah, hanya Anda yang memiliki akses ke semua informasi untuk spesifikasi permata tertentu.


2
Harus dicatat, "Dependency.new baru / regexp sudah usang" sekarang.
Martin Poljak

351

Ini mencantumkan semua permata yang telah saya instal.

gem query --local

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

Lihat 2.7 Mendaftar semua permata yang diinstal


37
Ketika saya melihat upvotes, maka jawaban ini adalah apa yang kebanyakan orang inginkan. :)
kaiser

4
ada jawaban yang lebih baik dalam pertanyaan itu sendiri gem list.
blueray

gem listmelakukan apa yang saya butuhkan, dan itu jauh lebih sederhana dan lebih mudah diingat ketika berada di CLI. Mengapa begitu banyak perintah untuk melakukan satu hal?
Dave Everitt

28

Kedua

gem query --local

dan

 ruby -S gem list --local

daftar 69 entri

Sementara

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

memberi saya 82

Saya dulu wc -lmendapatkan nomornya. Tidak yakin apakah itu cara yang tepat untuk memeriksa. Mencoba untuk mengarahkan kembali output ke file teks dan berbeda tetapi itu tidak membantu - perlu membandingkan secara manual satu per satu.


1
Alasannya sederhana. Perintah pertama hanya menambahkan 1 entri per permata dan mencantumkan versi dalam tanda kurung pada baris yang sama. rubyPerintah terakhir mencantumkan setiap versi permata pada baris yang terpisah. Untuk misalnya: 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

Sudah ada metode untuk ini sejak lama:

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

ruby -e 'menempatkan Gem :: Specification.all_names' memberi saya "-e: 1: permata konstan tak diinisialisasi (NameError)" Bagaimana cara saya mengatasi ini?
Metahuman

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

Namun, jika aplikasi Anda menggunakan Bundler, ia hanya akan mengembalikan daftar permata lokal yang bergantung . Untuk menginstal semua:

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

Ini memberi NoMethodError: undefined method apa? ' for nil: NilClass` ketika saya menggunakannya (dalam a rails console).
iconoclast


3

Versi yang lebih modern adalah menggunakan sesuatu yang mirip dengan yang berikut ...

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

CATATAN: sangat mirip dengan bagian pertama dari jawaban oleh Evgeny ... tetapi karena pemformatan halaman, mudah untuk dilewatkan.


3

Berikut ini adalah one-liner yang sangat bagus untuk mencetak semua Permata beserta versi, beranda, dan deskripsinya:

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

Mungkin Anda bisa mendapatkan file (permata) dari direktori permata?

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

1

Dari dalam jenis debugger Anda $LOAD_PATHuntuk mendapatkan daftar permata Anda. Jika Anda tidak memiliki debugger, pasang pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Ini akan menampilkan array permata yang Anda instal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.