क्या कोई रूबी विधि है जिसे मैं स्थापित रत्नों की सूची प्राप्त करने के लिए कह सकता हूं?
मैं के उत्पादन को पार्स करना चाहता हूं gem list
। क्या ऐसा करने का कोई अलग तरीका है?
क्या कोई रूबी विधि है जिसे मैं स्थापित रत्नों की सूची प्राप्त करने के लिए कह सकता हूं?
मैं के उत्पादन को पार्स करना चाहता हूं gem list
। क्या ऐसा करने का कोई अलग तरीका है?
जवाबों:
जेम कमांड को अब रूबी 1.9+ के साथ शामिल किया गया है, और रूबी प्री-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
कमांड-लाइन के समान है , केवल आपके पास किसी विशेष रत्न के विनिर्देश के लिए सभी जानकारी तक पहुंच है।
यह मेरे द्वारा स्थापित सभी रत्नों को सूचीबद्ध करता है।
gem query --local
http://guides.rubygems.org/command-reference/#gem-list
2.7 सभी स्थापित रत्नों को सूचीबद्ध करना देखें
gem list
।
gem list
बिल्कुल वही किया जो मुझे चाहिए था, और यह बहुत सरल और याद करने में आसान है जब सीएलआई पर। एक काम करने के लिए इतनी आज्ञा क्यों?
दोनों
gem query --local
तथा
ruby -S gem list --local
सूची 69 प्रविष्टियों
जबकि
ruby -e 'puts Gem::Specification.all_names'
मुझे 82 देता है
मुझे wc -l
नंबर मिलते थे। निश्चित नहीं है कि जाँचने का सही तरीका है या नहीं। पाठ फ़ाइलों के लिए आउटपुट को पुनर्निर्देशित करने की कोशिश की और diff'ed लेकिन वह मदद नहीं की - मैन्युअल रूप से एक-एक करके तुलना करने की आवश्यकता होगी।
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
सदियों से इसके लिए एक तरीका है:
ruby -e 'puts Gem::Specification.all_names'
Gem::Specification.map {|a| a.name}
हालांकि, यदि आपका ऐप बुंडलर का उपयोग करता है, तो यह केवल निर्भर स्थानीय रत्नों की सूची लौटाएगा । सभी स्थापित करने के लिए:
def all_installed_gems
Gem::Specification.all = nil
all = Gem::Specification.map{|a| a.name}
Gem::Specification.reset
all
end
NoMethodError: undefined method
कोई देता है ? ' शून्य के लिए: NilClass` जब मैं इसे (ए rails console
) का उपयोग करता हूं ।
इस कोड का उपयोग करें (कंसोल मोड में):
Gem::Specification.all_names
एक और अधिक आधुनिक संस्करण कुछ का उपयोग करने के लिए निम्नलिखित होगा ...
require 'rubygems'
puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') }
ध्यान दें: बहुत ही एवगेनी द्वारा एक जवाब के पहले भाग के समान है ... लेकिन पृष्ठ स्वरूपण के कारण, यह याद करना आसान है।
यहाँ अपने संस्करण, मुखपृष्ठ और विवरण के साथ सभी रत्नों को प्रिंट करने के लिए एक बहुत अच्छा वन-लाइनर है:
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
अपने डीबगर प्रकार $LOAD_PATH
से अपने रत्नों की सूची प्राप्त करने के लिए। यदि आपके पास डिबगर नहीं है, तो pry स्थापित करें:
gem install pry
pry
Pry(main)> $LOAD_PATH
यह आपके स्थापित रत्नों की एक सरणी का उत्पादन करेगा।