जवाबों:
कैसा रहेगा:
Dir["/path/to/directory/*.rb"].each {|file| require file }
require
की उपस्थिति या अनुपस्थिति से भ्रमित नहीं है .rb
। एमआरआई 1.8.7-p374, 2.1.5 और 2.2.0 पर परीक्षण किया गया। यह शहरी किंवदंती रेल से आती है, जहां "चतुर" ऑटोलोडिंग ने पुराने संस्करणों में वर्णित व्यवहार का प्रदर्शन किया (और अभी भी इसे प्रदर्शित कर सकता है)।
यदि यह फाइल के सापेक्ष एक निर्देशिका है जो आवश्यक है (उदाहरण के लिए आप सभी फाइलों को लोड करना चाहते हैं):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
संपादित करें: नीचे दी गई टिप्पणियों के आधार पर, एक अद्यतन संस्करण:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each {|file| require file }
Dir[File.join(File.dirname(__FILE__), 'lib', '*.rb')].each {|file| require file }
__dir__
इसके स्थान पर उपयोग कर सकते हैं File.dirname(__FILE__)
।
require_relative
एक निर्देशिका में सभी फ़ाइलों की आवश्यकता के लिए आप कैसे उपयोग करते हैं ?
आवश्यक रत्न की कोशिश करें:
यह आपको बस देता है:
require_all 'path/to/directory'
require_all
चक्रीय निर्भरता समाधान आपके स्रोत कोड में एक समस्या के आसपास काम करता है: आपके पास रूबी स्रोत फाइलें हैं, जिन्हें उनकी निर्भरता की आवश्यकता नहीं है। यह स्केलपेल लोडिंग पर दरवाजे को बंद कर देता है, आपको सभी-या-कुछ लोड करने के लिए प्रतिबद्ध करता है। यह छोटे पुस्तकालयों में कोई समस्या नहीं है, लेकिन यह एक ऐसा निर्णय है जिसे आपको सचेत रूप से करना चाहिए।
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
यदि आप एक्सटेंशन नहीं छीनते हैं तो आप एक ही फाइल को दो बार समाप्त कर सकते हैं (माणिक को यह महसूस नहीं होगा कि "फू" और "फू.बीबी" एक ही फाइल हैं)। एक ही फ़ाइल को दो बार आवश्यक करने से गंभीर चेतावनी हो सकती है (उदाहरण के लिए "चेतावनी: पहले से ही आरंभिक स्थिर")।
require "foo.rb"; require "foo";
लोड होगा foo.rb
।
require
की उपस्थिति या अनुपस्थिति से भ्रमित नहीं है .rb
। एमआरआई 1.8.7-p374, 2.1.5 और 2.2.0 पर परीक्षण किया गया। यह शहरी किंवदंती रेल से आती है, जहां "चतुर" ऑटोलोइंग ने पुराने संस्करणों में वर्णित व्यवहार का प्रदर्शन किया (और अभी भी इसे प्रदर्शित कर सकता है)।
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
या वैकल्पिक रूप से, यदि आप विशिष्ट फ़ोल्डरों को लोड करने के लिए फ़ाइलों को स्कोप करना चाहते हैं:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
स्पष्टीकरण:
Dir.glob तर्क के रूप में एक ब्लॉक लेता है।
विधि (: की आवश्यकता है) की आवश्यकता विधि वापस आ जाएगी।
और विधि (: आवश्यकता) विधि को एक ब्लॉक में बदल देगी।
Dir.glob( File.join( File.dirname(__FILE__), '{lib,addons}', 'subfolder', '**', '*.rb' ), &method(:require) )
प्लेटफ़ॉर्म (जैसे '/' या '\') पर निर्भरता को समाप्त करता है। अच्छा काम करता है। धन्यवाद।
सबसे अच्छा तरीका है कि डायरेक्टरी को लोड पथ और फिर require
प्रत्येक फ़ाइल के बेसनेम से जोड़ा जाए । इसका कारण यह है कि आप गलती से एक ही फ़ाइल को दो बार आवश्यक रूप से बचना चाहते हैं - अक्सर इच्छित व्यवहार नहीं। किसी फ़ाइल को लोड किया जाएगा या नहीं, इस पर निर्भर है कि क्या require
इससे पहले पथ को देखा है। उदाहरण के लिए, यह सरल आईआरबी सत्र दिखाता है कि आप गलती से एक ही फ़ाइल को दो बार लोड और लोड कर सकते हैं।
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
ध्यान दें कि पहली दो पंक्तियों का true
अर्थ है कि एक ही फाइल को दोनों बार लोड किया गया था। जब पथ का उपयोग किया जाता है, भले ही पथ उसी स्थान को इंगित करते हों, लेकिन require
यह नहीं जानते कि फ़ाइल पहले से ही आवश्यक थी।
इसके बजाय, हम एक निर्देशिका को लोड पथ में जोड़ते हैं और फिर प्रत्येक * .rb फ़ाइल के बेसनेम की आवश्यकता होती है।
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
यदि आपको एक से अधिक बार फ़ाइल की आवश्यकता के बारे में परवाह नहीं है, या आपका इरादा सिर्फ फ़ाइल की सामग्री को लोड load
करना है , तो शायद इसके बजाय इसका उपयोग किया जाना चाहिए require
। इस मामले में लोड का उपयोग करें, क्योंकि यह बेहतर व्यक्त करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। उदाहरण के लिए:
Dir["/path/to/directory/*.rb"].each {|file| load file }
कुछ जवाबों की तरह, पथ का उपयोग करने के बजाय, मैं उपयोग करता हूं File.expand_path
:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
अपडेट करें:
उपयोग करने के बजाय File.dirname
आप निम्नलिखित कार्य कर सकते हैं:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
कहाँ ..
का फ़ाइल नाम छीनता है __FILE__
।
File.expand_path
Rails.root.join
यदि आप रेल में हैं तो विभिन्न उत्तर भी काम करते हैं।
रेल में, आप कर सकते हैं:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
अपडेट: स्लैश को हटाने के लिए @ जिग्नेश गोहल के सुझाव के साथ सही किया गया।
Rails.root.join('/lib')
लिए सही मार्ग उत्पन्न नहीं करता है। मुझे यह सही ढंग से काम करने के लिए मिला:Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
और किस बारे में require_relative *Dir['relative path']
:?
require_relative *Dir['*.rb']
काम, अगर केवल एक रूबी-स्क्रिप्ट है। लेकिन अगर एक से अधिक गहरे लाल रंग का लिपियों पाए जाते हैं, आप प्राप्तrequire_relative': wrong number of arguments (4 for 1) (ArgumentError)