রুবির ডিরেক্টরি থেকে সমস্ত ফাইলের প্রয়োজনের সর্বোত্তম উপায় কী?
রুবির ডিরেক্টরি থেকে সমস্ত ফাইলের প্রয়োজনের সর্বোত্তম উপায় কী?
উত্তর:
কেমন:
Dir["/path/to/directory/*.rb"].each {|file| require file }
require
উপস্থিতি বা অনুপস্থিতিতে রুবি বিভ্রান্ত নয় .rb
। এমআরআই 1.8.7-p374, 2.1.5 এবং 2.2.0 পরীক্ষিত। এই শহুরে কিংবদন্তিটি রেলগুলি থেকে এসেছে, যেখানে "চালাক" অটলয়েডিং তার পুরানো সংস্করণগুলিতে বর্ণিত আচরণটি প্রদর্শন করেছিল (এবং এখনও এটি প্রদর্শিত হতে পারে)।
যদি এটি প্রয়োজনীয় কোনও ফাইলের সাথে সম্পর্কিত ডিরেক্টরি হয় (যেমন আপনি lib ডিরেক্টরিতে সমস্ত ফাইল লোড করতে চান):
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
আপনি যদি এক্সটেনশানটি না ছড়িয়ে দেন তবে আপনার একই ফাইলটি দু'বারের জন্য শেষ হতে পারে (রুবি বুঝতে পারবেন না যে "foo" এবং "foo.rb" একই ফাইল)। দু'বার একই ফাইলের প্রয়োজনের কারণে উত্সাহজনক সতর্কতা হতে পারে (উদাঃ "সতর্কতা: ইতিমধ্যে ধ্রুবকটি ইতিমধ্যে সূচনা হয়েছে")।
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
করে তবে ফাইলটি ইতিমধ্যে প্রয়োজনীয় ছিল না know
এখানে পরিবর্তে, আমরা লোড পথে একটি ডিরেক্টরি যুক্ত করি এবং তারপরে প্রতিটি * .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)