2010-06-24 6 views
10

मैं एक छोटे से आधार कार्यक्रम, कि दो प्लगइन्स में पढ़ता है और उन्हें पंजीकृत करता है की एक बहुत ही बुनियादी उदाहरण चाहते हैं। ये दो प्लगइन्स बेस प्रोग्राम में एक समान तरीके से एक समान तरीके से हुक करते हैं।रूबी प्लगइन वास्तुकला

मैं बहुत उस बात के लिए किसी भी प्रोग्रामिंग भाषा में metaprogramming के लिए नया हूँ, मुझे यकीन है कि जहां शुरू करने के लिए नहीं कर रहा हूँ।

+1

पैडेंटिक होने के लिए खेद है, लेकिन रेल फ्रेमवर्क से जुड़े प्लगइन्स नहीं हैं, न कि रूबी के साथ? –

+0

रेल फ्रेमवर्क में प्लगइन हैं, लेकिन मैं रूबी एप्लिकेशन के संदर्भ में प्लगइन सिस्टम बनाने के बारे में बात कर रहा हूं। तो कहें कि आपके पास एक कक्षा है जो एक टेक्स्ट फ़ाइल पढ़ती है। मैं एक प्लगइन सिस्टम बनाना चाहता हूं जो आपको एक प्लगइन क्लास लिखने देता है जो पाठक वर्ग में हुक करता है ताकि आप कह सकें, एक अपकेस प्लगइन या 1337 प्लगइन जो आउटपुट को संशोधित करता है। यह एक मूल उदाहरण है, लेकिन यह आपको एक विचार देना चाहिए। –

+5

रूबी रेल की तुलना में बहुत अधिक है, भले ही रेल वहां सबसे प्रसिद्ध ढांचे हैं। कह रही है कि प्लगइन रेल के साथ जुड़े हुए हैं जैसे कि गैसोलीन स्पोर्ट्स कारों से जुड़ा हुआ है। गैर-मोटर वाहन चीजों सहित गैसोलीन का उपयोग करने वाली अन्य चीजों की एक दुनिया है। –

उत्तर

8

मैं थोड़ी देर के लिए यह बहुत ही समस्या पर अब काम कर रहा है। मैंने ऐसा करने के लिए कई अलग-अलग तरीकों की कोशिश की है और इस पर बहुत से लोगों से सलाह मांगी है। मुझे अभी भी यकीन नहीं है कि मेरे पास क्या है 'सही तरीका' है, लेकिन यह अच्छी तरह से काम करता है और करना आसान है।

मेरे मामले में

, मैं विशेष रूप से विन्यास को देख रहा हूँ और विन्यास प्लगइन्स में लाने, लेकिन सिद्धांत एक ही है, भले ही मेरा के लिए शब्दावली cnfiguration लिए विशिष्ट है।

एक बहुत ही बुनियादी स्तर पर, मैं इसे में कुछ भी नहीं के साथ एक विन्यास वर्ग है - यह खाली है। मैं भी एक विन्यस्त विधि है जो विन्यास वर्ग वापस आती है और आप उस पर तरीकों कॉल की सुविधा देता है है:

# config.rb 
class Configuration 
end 

class MySystem 
    def self.configure 
    @config ||= Configuration.new 
    yield(@config) if block_given? 
    @config 
    end 

    Dir.glob("plugins/**/*.rb").each{|f| require f} 
end 

MySystem.configure do |config| 
    config.some_method 
    config.some_value = "whatever" 
    config.test = "that thing" 
end 

puts "some value is: #{MySystem.configure.some_value}" 
puts "test #{MySystem.configure.test}" 

some_method और विन्यास वर्ग पर some_value प्राप्त करने के लिए, मैं प्लग-इन मॉड्यूल के माध्यम से विन्यास वस्तु का विस्तार है:

# plugins/myconfig.rb 
module MyConfiguration 
    attr_accessor :some_value 

    def some_method 
    puts "do stuff, here" 
    end 
end 

class Configuration 
    include MyConfiguration 
end 

और

# plugins/another.rb 
module AnotherConfiguration 
    attr_accessor :test 
end 

class Configuration 
    include AnotherConfiguration 
end 

प्लगइन्स को लोड करने के लिए, आप केवल कोड में से एक की जरूरत है एक विशिष्ट फ़ोल्डर में .rb फ़ाइलों के लिए देखने के लिए और 'की आवश्यकता होती है' उन्हें । यह कोड तब तक कहीं भी रह सकता है जब तक यह फ़ाइल चलाया जाता है जब फ़ाइल को इसमें लोड किया जाता है ... मैं शायद इसे माइस्सिस्टम के लिए कक्षा परिभाषा में रखूंगा या ऐसा कुछ शुरू करने के लिए। समझ में आता है तो शायद इसे कहीं और ले जाएं।

Dir.glob("plugins/**/*.rb").each{|f| require f}

रन config.rb और आप उत्पादन कि इस तरह दिखता है मिल जाएगा:

do stuff, here 
some value is: whatever 
test that thing 

वहाँ इस के विभिन्न भागों लागू करने के लिए विकल्पों में से एक बहुत कुछ कर रहे हैं, लेकिन यह आप नीचे मिलना चाहिए पथ।

2

ऐसा लगता है कि इस परियोजना में मदद मिल सकती है: https://github.com/eadz/plugman

मैं हालांकि कुछ भी है कि एम्बेडेड संभाल लेंगे नहीं मिला है (मणि) तथापि निर्भरता। रूबी फाइलों सहित सरल है लेकिन एक बार आपके प्लगइन्स को अन्य पुस्तकालयों की आवश्यकता होने के बाद यह सरल मॉडल अलग हो जाता है (या तो सभी डिप्टी को आपके एप्लिकेशन के साथ स्थापित किया जाना चाहिए, या आपको प्रक्रिया में प्लगइन निर्भरता रत्न प्राप्त करने के लिए कुछ अन्य तंत्र की आवश्यकता है)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^