2009-12-04 8 views
16

मैं एक एपीआई पर काम कर रहा हूं जिसे अपनी वर्तमान निर्देशिका और सभी उपनिर्देशिकाओं में सभी .rb फ़ाइलों को लोड करने की आवश्यकता है। वर्तमान में, मैं जो भी फाइल जोड़ता हूं, उसके लिए मैं एक नई आवश्यकता कथन दर्ज कर रहा हूं लेकिन मैं इसे बनाना चाहता हूं जहां मुझे केवल उपनिर्देशिका में से एक में फ़ाइल रखना है और इसे स्वचालित रूप से जोड़ा गया है।क्या रूबी में निर्देशिका में सभी फ़ाइलों की पुनरावृत्ति की आवश्यकता है?

क्या ऐसा करने के लिए मानक आदेश है?

+1

बस एक नोट: संभावित रूप से अज्ञात फ़ाइलों का एक सेट आवश्यक है खतरनाक है और इससे त्रुटियों का कारण बन सकता है। आइए मान लें कि मैंने इसमें एक निकास कथन के साथ die.rb नामक एक फ़ाइल डाली है (क्षमा करें, कोई वास्तविक कोड नहीं, मैंने कभी रूबी का उपयोग नहीं किया है), जैसे ही यह लोड हो जाता है, प्रोग्राम समाप्त होता है। या क्या होगा यदि उपयोगकर्ता फ़ाइल हटा देता है? उस फ़ाइल द्वारा प्रदान किए गए कार्यों को लोड नहीं किया जाएगा। यदि आप केवल सुरक्षा समस्या को नजरअंदाज करना चाहते हैं, जिसमें फाइलें शामिल हैं और यह सुनिश्चित करने के लिए जांच कर रहे हैं कि वे लोड किए गए हैं (किसी प्रकार के चेक फ़ंक्शन को कॉल करके), लेकिन फिर भी, कोई रूबी अनुभव नहीं हो सकता है। – HalfBrian

उत्तर

39

इस मामले lib निर्देशिका के अंतर्गत अपनी लोड हो रहा है सभी फाइलों में:

Dir["#{File.dirname(__FILE__)}/lib/**/*.rb"].each { |f| load(f) } 
+1

आप 'लोड' का उपयोग क्यों करते हैं और' आवश्यकता 'नहीं करते? – johannes

+0

आप दोनों का उपयोग कर सकते हैं, लेकिन फ़ाइल नाम के बजाए, कोई विस्तार के साथ आमतौर पर लाइब्रेरी नाम पारित करने की आवश्यकता होती है। –

+1

लेकिन 'आवश्यकता', यदि आप एक्सटेंशन में पास करते हैं तो कोई फर्क नहीं पड़ता है, इसलिए मेरी राय में यह बेहतर है – johannes

6
require "find" 

Find.find(folder) do |file| 
    next if File.extname(file) != ".rb" 
    puts "loading #{file}" 
    load(file) 
end 

यह प्रत्येक .rb फ़ाइल को दोबारा लोड करेगा।

0
def rLoad(dir) 
    Dir.entries(dir).each {|f| 
     next if f=='.' or f=='..' 
     if File.directory?(f) 
      rInclude(f) 
     else 
      load(f) if File.fnmatch('*.rb', f) 
     end 
    } 
end 

यह रिकर्सिवली load निर्देशिका में सभी .rb फ़ाइलों dir द्वारा निर्दिष्ट करना चाहिए। उदाहरण के लिए, rLoad Dir.pwd वर्तमान कार्य निर्देशिका पर काम करेगा।

हालांकि, ऐसा करने से सावधान रहें। यह गहराई से पहली खोज करता है और यदि आपकी रूबी स्क्रिप्ट में कोई विरोधाभासी परिभाषाएं हैं, तो उन्हें कुछ गैर-स्पष्ट तरीके से हल किया जा सकता है (फ़ोल्डर/फ़ाइल नाम के अनुसार वर्णमाला)।

+0

आप अपने लोड कॉल में सीधे 'एफ' के खिलाफ क्यों मेल नहीं खाते हैं? – Geo

+0

यदि आप 'file.fnmatch (' *। Rb ', f)' कथन का जिक्र कर रहे हैं, तो फ़ाइल नाम 'f 'पैटर्न' * .rb' से मेल खाता है, तो कथन सत्य लौटाता है। यह सुनिश्चित करता है कि हम केवल 'लोड'-इन रूबी स्क्रिप्ट हैं और फ़ोल्डर में होने वाली अन्य फाइलें नहीं हैं। ध्यान दें कि यदि आपको कुछ स्क्रिप्ट्स हैं जो .rbw एक्सटेंशन का उपयोग करते हैं, तो आपको एक और शर्त जोड़नी पड़ सकती है। – bta

+0

हां। लेकिन अगर आप f = ~/\। आरबी/'अगर लोड (एफ) का इस्तेमाल कर सकते थे। मैं इस बात का जिक्र कर रहा था कि आप बिल्टिन रेगेक्स समर्थन पर एफएनएमएच का उपयोग क्यों कर रहे हैं। – Geo

0

आपको इस gem पर एक नज़र रखना चाहिए। यह काफी छोटा है ताकि आप वास्तव में पूरे मणि को स्थापित करने के बजाय कोड का पुनः उपयोग कर सकें।

+0

लिंक टूटा हुआ है। – juan2raid

+0

http://github.com/mlightner/require_directory यह काम करना चाहिए। – Waseem

2

मिगुएल फ़ोनसेका की तरह कहा है, लेकिन रूबी में> = 2 आप कर सकते हैं:

Dir[File.expand_path "lib/**/*.rb"].each{|f| require_relative(f)} 
2

मैं मणि require_all हर समय का उपयोग, और यह काम में निम्नलिखित पैटर्न के साथ किया जाता है अपने की आवश्यकता है:

require 'require_all' 
require_all './lib/exceptions/' 
संबंधित मुद्दे

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