รายการอัญมณีที่ติดตั้งแล้ว?


142

มีวิธีทับทิมที่ฉันสามารถโทรเพื่อรับรายการของอัญมณีที่ติดตั้งหรือไม่

gem listฉันต้องการที่จะแยกการส่งออกของ มีวิธีอื่นในการทำเช่นนี้หรือไม่?

คำตอบ:


55

คำสั่ง Gem นั้นมาพร้อมกับ Ruby 1.9+ ตอนนี้และเป็นส่วนเสริมมาตรฐานของ Ruby pre-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

นี่คือวิธีการอัปเดตเพื่อรับรายการ:

require 'rubygems'

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

เนื่องจากlocal_gemsอาศัยgroup_byมันจะส่งคืนค่าแฮชของอัญมณีโดยที่คีย์คือชื่อของอัญมณีและค่าเป็นอาร์เรย์ของข้อกำหนดคุณสมบัติของอัญมณี ค่าเป็นอาร์เรย์ของอินสแตนซ์ของอัญมณีที่ติดตั้งเรียงลำดับตามหมายเลขรุ่น

นั่นทำให้สามารถทำสิ่งต่าง ๆ เช่น:

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]

และ:

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

ตัวอย่างสุดท้ายคล้ายกับgem query --localบรรทัดคำสั่งมีเพียงคุณเท่านั้นที่สามารถเข้าถึงข้อมูลทั้งหมดสำหรับข้อมูลจำเพาะของอัญมณีโดยเฉพาะ


2
ควรสังเกตว่า "Dependency.new จะมีการยกเลิก regexp" ตอนนี้
Martin Poljak

351

นี่แสดงรายการอัญมณีทั้งหมดที่ฉันติดตั้ง

gem query --local

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

ดู 2.7 รายการอัญมณีที่ติดตั้งทั้งหมด


37
เมื่อฉันดู upvotes คำตอบนี้คือสิ่งที่คนส่วนใหญ่ต้องการ :)
ไกเซอร์

4
gem listมีคำตอบที่ดีกว่าในคำถามของตัวเอง
blueray

gem listทำสิ่งที่ฉันต้องการอย่างแน่นอนและมันง่ายกว่าและจำง่ายกว่าเมื่อนึกถึง CLI ทำไมคำสั่งมากมายที่ต้องทำสิ่งหนึ่ง
Dave Everitt

28

ทั้งสอง

gem query --local

และ

 ruby -S gem list --local

รายการ 69 รายการ

ในขณะที่

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

ให้ฉัน 82

ฉันเคยwc -lได้รับตัวเลข ไม่แน่ใจว่าเป็นวิธีการตรวจสอบที่ถูกต้องหรือไม่ พยายามเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ข้อความและไม่กระจาย แต่นั่นไม่ได้ช่วย - จะต้องเปรียบเทียบด้วยตนเองทีละคน


1
เหตุผลง่าย ๆ คำสั่งแรกเพียงเพิ่ม 1 รายการต่ออัญมณีและรายการรุ่นในวงเล็บในบรรทัดเดียวกัน rubyคำสั่งสุดท้ายแสดงรายการอัญมณีแต่ละเวอร์ชันในบรรทัดแยกต่างหาก สำหรับเช่น: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)กับ sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
Kaiser

10

มีวิธีการนี้สำหรับทุกวัย:

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

ruby -e 'ทำให้ Gem :: Specification.all_names' ให้ฉัน "-e: 1: ค่าคงที่ที่ไม่ได้กำหนดค่าเริ่มต้น Gem (NameError)" ฉันจะแก้ปัญหานี้อย่างไร
Metahuman

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

อย่างไรก็ตามหากแอปของคุณใช้ Bundler แอปจะส่งคืนรายการของอัญมณีในท้องถิ่นที่ต้องพึ่งพา ในการรับการติดตั้งทั้งหมด:

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

สิ่งนี้ให้NoMethodError: undefined method อะไรบ้าง? ' สำหรับ nil: NilClass` เมื่อฉันใช้ (ในrails console)
iconoclast


3

รุ่นที่ทันสมัยกว่านี้คือใช้บางสิ่งบางอย่างที่คล้ายกับต่อไปนี้ ...

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

หมายเหตุ: คล้ายกับส่วนแรกของคำตอบของ Evgeny ... แต่เนื่องจากการจัดรูปแบบหน้ามันง่ายที่จะพลาด


3

นี่เป็นหนึ่งในสายการบินที่ดีมากในการพิมพ์อัญมณีทั้งหมดพร้อมกับเวอร์ชันหน้าแรกและคำอธิบายของพวกเขา:

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

บางทีคุณอาจได้รับไฟล์ (อัญมณี) จากไดเรกทอรีอัญมณี?

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

1

จากภายในประเภทดีบักเกอร์ของคุณ$LOAD_PATHเพื่อรับรายการอัญมณีของคุณ หากคุณไม่มีดีบักเกอร์ให้ติดตั้งแงะ:

gem install pry
pry
Pry(main)> $LOAD_PATH

จะเป็นการส่งออกอาเรย์ของอัญมณีที่คุณติดตั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.