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?

Prakash Raman
sumber

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 = "[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]

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.

Manusia Timah
sumber
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

frankstuner
sumber
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.

Roobie
sumber
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'

sumber
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
Evgenii
sumber
Ini memberi NoMethodError: undefined method apa? ' for nil: NilClass` ketika saya menggunakannya (dalam a rails console).
iconoclast
4

gunakan kode ini (dalam mode konsol):

Gem::Specification.all_names
Игорь Хлебников
sumber
dapatkah Anda meningkatkan jawaban Anda?
MZaragoza
ditingkatkan atau beri tahu saya apa yang sebenarnya tidak Anda sukai dalam jawaban saya
Игорь Хлебников
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.

paul.belt
sumber
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
Darren Hicks
sumber
2

Cobalah di terminal:

ruby -S gem list --local
Kurt Russell
sumber
1
Perhatikan bahwa OP menginginkan metode Ruby .
the Tin Man
1

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

gemsdir = "gems directory"
gems = Dir.new(gemsdir).entries
Fossmo
sumber
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.

Nicolai Robles
sumber