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?
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:
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_gems
bergantung 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 --local
perintah, hanya Anda yang memiliki akses ke semua informasi untuk spesifikasi permata tertentu.
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
gem list
.
gem list
melakukan 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?
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 -l
mendapatkan 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.
ruby
Perintah 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
Sudah ada metode untuk ini sejak lama:
ruby -e 'puts Gem::Specification.all_names'
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
NoMethodError: undefined method
apa? ' for nil: NilClass` ketika saya menggunakannya (dalam a rails console
).
gunakan kode ini (dalam mode konsol):
Gem::Specification.all_names
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.
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
Cobalah di terminal:
ruby -S gem list --local
Dari dalam jenis debugger Anda $LOAD_PATH
untuk 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.