রুবিতে কোনও ডিরেক্টরি থেকে সমস্ত ফাইলের প্রয়োজনের সর্বোত্তম উপায়?


351

রুবির ডিরেক্টরি থেকে সমস্ত ফাইলের প্রয়োজনের সর্বোত্তম উপায় কী?


আপনি ডিরেক্টরিটির একই নামের সাথে একটি ফাইল তৈরি করতে পারেন এবং এতে সমস্ত ফাইলের প্রয়োজন হয়। আরএসপেক এটি করে।
পেড্রোম্যানোয়েল

উত্তর:


462

কেমন:

Dir["/path/to/directory/*.rb"].each {|file| require file }

18
পিকাক্সের মতে .rb এক্সটেনশন alচ্ছিক। প্রযুক্তিগতভাবে এটির অর্থ পরিবর্তিত হয়: "foo.rb প্রয়োজন" এর জন্য foo.rb প্রয়োজন, তবে "foo.rb" প্রয়োজন "foo.rb, foo.so বা foo.dll প্রয়োজন।
স্যাম স্টোকস

28
এক্সটেনশানটি কেটে না নেওয়ার জন্য একটি সূক্ষ্ম গোচা রয়েছে। যদি কোড কলগুলির অন্য কোনও অংশে 'foo' প্রয়োজন হয় তবে রুবি আবার একই ফাইলটি লোড করবে, যা তীব্র ত্রুটি বাড়ে। আমি আমার নিজের উত্তর যুক্ত করেছি যা এটি ব্যাখ্যা করে এবং কীভাবে এক্সটেনশানটি ছাঁটাতে হবে তা দেখায়।
পিট হজসন

4
@ পিট, এটি কি এখনও সত্য? দেখুন রেনের মন্তব্য কম।
আন্দ্রেজ Riofrio

5
এটি সুস্পষ্ট হতে পারে তবে এটি লক্ষণীয় যে .rb হ্রাসের জন্য ডিআর-তে কোনও নন .rb ফাইলের প্রয়োজন হবে যা সম্ভবত পছন্দসই নয়।
ব্যবহারকারী 2398029

10
@ পিটহডসনের পরামর্শটি সঠিক নয়। এক্সটেনশনের requireউপস্থিতি বা অনুপস্থিতিতে রুবি বিভ্রান্ত নয় .rb। এমআরআই 1.8.7-p374, 2.1.5 এবং 2.2.0 পরীক্ষিত। এই শহুরে কিংবদন্তিটি রেলগুলি থেকে এসেছে, যেখানে "চালাক" অটলয়েডিং তার পুরানো সংস্করণগুলিতে বর্ণিত আচরণটি প্রদর্শন করেছিল (এবং এখনও এটি প্রদর্শিত হতে পারে)।
শেলডনহ

345

যদি এটি প্রয়োজনীয় কোনও ফাইলের সাথে সম্পর্কিত ডিরেক্টরি হয় (যেমন আপনি lib ডিরেক্টরিতে সমস্ত ফাইল লোড করতে চান):

Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }

সম্পাদনা করুন: নীচের মন্তব্যের ভিত্তিতে, একটি আপডেট সংস্করণ:

Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }

14
আপনি এই জাতীয় সমস্ত ডিরেক্টরি ডিরেক্টরিও যুক্ত করতে পারেনDir[File.dirname(__FILE__) + '/support/**/*.rb'].each {|file| require file }
jspooner

62
ফরোয়ার্ড / পশ্চাদপদ স্ল্যাশ সম্পর্কে অনুমান করার চেয়ে ফাইল.জয়িন ব্যবহার করা সম্ভবত নিরাপদ:Dir[File.join(File.dirname(__FILE__), 'lib', '*.rb')].each {|file| require file }
ক্রিস

6
প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিতও রয়েছে
মাশা

30
যদি আপনি> = রুবি ২.০ ব্যবহার করেন তবে আপনি এর __dir__পরিবর্তে ব্যবহার করতে পারেন File.dirname(__FILE__)
খ্রিস্টান ব্যাঙ্কেস্টার

3
@maasha আপনি কীভাবে require_relativeএকটি ডিরেক্টরিতে সমস্ত ফাইল প্রয়োজন ব্যবহার করবেন?
ডেভিড মোলস

101

প্রয়োজনীয়_ সমস্ত রত্ন চেষ্টা করুন:

  1. http://github.com/jarmo/require_all
  2. https://rubygems.org/gems/require_all

এটি আপনাকে সহজভাবে দেয়:

require_all 'path/to/directory'

আমার সমস্ত অ্যাক্টিভেকর্ড মডেল অন্তর্ভুক্ত করা দরকার, প্রয়োজনীয়_ সমস্ত রত্নটি সমস্ত নির্ভরতা খুঁজে পেয়েছিল এবং সেগুলি নিখুঁতভাবে প্রয়োজন। ধন্যবাদ!
পানুপান

2
@ ফানুপান কেবল সচেতন থাকুন যে require_allএর উত্সচক্রীয় নির্ভরতা রেজোলিউশনটি আপনার উত্স কোডের কোনও সমস্যাটিকে ঘিরে কাজ করে: আপনার কাছে রুবি উত্স ফাইল রয়েছে যা তাদের নির্ভরতার প্রয়োজন হয় না। এটি স্ক্যাল্পেল লোডিংয়ের দরজা বন্ধ করে দেয়, আপনাকে সর্ব-বা-কিছুই লোড করার প্রতিশ্রুতি দেয়। এটি ছোট লাইব্রেরিতে কোনও সমস্যা নয়, তবে আপনার সচেতনভাবে সিদ্ধান্ত নেওয়া উচিত এমন সিদ্ধান্ত।
শেলডনহ

আপনার অ্যাপ্লিকেশনটিকে রত্ন দিয়ে প্রসারণ করার কোনও বুদ্ধি নেই যা আপনি কেবল কোডের একটি লাইন দিয়ে প্রতিস্থাপন করতে পারেন। এটি আপনার অ্যাপ্লিকেশনটির লোড সময় বাড়িয়ে তোলে এবং দীর্ঘ মেয়াদে আরও বাগ প্রেরণা দেয়।
পেরে জোয়ান মার্তোরেল

52
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file| 
  require File.basename(file, File.extname(file))
end

আপনি যদি এক্সটেনশানটি না ছড়িয়ে দেন তবে আপনার একই ফাইলটি দু'বারের জন্য শেষ হতে পারে (রুবি বুঝতে পারবেন না যে "foo" এবং "foo.rb" একই ফাইল)। দু'বার একই ফাইলের প্রয়োজনের কারণে উত্সাহজনক সতর্কতা হতে পারে (উদাঃ "সতর্কতা: ইতিমধ্যে ধ্রুবকটি ইতিমধ্যে সূচনা হয়েছে")।


11
আসলেই কি এই ঘটনা? ডকুমেন্টেশন বলে: একটি বৈশিষ্ট্য লোড হবে না যদি এর নামটি ইতিমধ্যে $ "এ উপস্থিত হয় তবে ফাইলের নামটি পরম পথে রূপান্তরিত হয়, সুতরাং" প্রয়োজন 'এ'; './a' "প্রয়োজন দুইবার a.rb লোড করবে না। ruby-doc.org/core/classes/Kernel.html#M001418
ডেরেক

13
আমার পরীক্ষায় ডেরেক যা বলেছিল তা একই দেখাচ্ছে: মাত্র একবারে require "foo.rb"; require "foo";লোড হবে foo.rb
রিনি সরসু

@ পিটহডসন- আপনি কি এটিকে ব্যাক আপ করতে পারেন?
ইয়ারিন

4
নং রুবি এক্সটেনশনের requireউপস্থিতি বা অনুপস্থিতিতে বিভ্রান্ত নয় .rb। এমআরআই 1.8.7-p374, 2.1.5 এবং 2.2.0 এ পরীক্ষিত। এই শহুরে কিংবদন্তিটি রেলগুলি থেকে এসেছে, যেখানে "চালাক" স্বতঃস্ফূর্তভাবে পুরানো সংস্করণগুলিতে বর্ণিত আচরণটি প্রদর্শন করেছিল (এবং এখনও এটি প্রদর্শিত হতে পারে)।
শেলডনহ

45
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))

অথবা বিকল্পভাবে, যদি আপনি নির্দিষ্ট ফোল্ডারে লোড করার সুযোগগুলি চান:

Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))

ব্যাখ্যা:

Dir.glob আর্গুমেন্ট হিসাবে একটি ব্লক নেয়।

পদ্ধতি (: প্রয়োজন) প্রয়োজনীয় পদ্ধতিটি ফিরিয়ে দেবে।

& পদ্ধতি (: প্রয়োজনীয়) পদ্ধতিটিকে একটি ব্লকে রূপান্তর করবে।


2
এটি কিছু সুন্দর কোড। আমি পছন্দ করি কীভাবে কোনও দৃশ্যমান ব্লক নেই।
নাট সিমার

1
Dir.glob( File.join( File.dirname(__FILE__), '{lib,addons}', 'subfolder', '**', '*.rb' ), &method(:require) )প্ল্যাটফর্মের উপর নির্ভরতা দূর করে (যেমন '/' বা '\')। ভাল কাজ করে. ধন্যবাদ।
ইভান ব্ল্যাক

30

সর্বোত্তম উপায় হ'ল ডিরেক্টরিটি লোড পাথের সাথে যুক্ত করা এবং তারপরে 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 }

14

কিছু উত্তরের মতো লক্ষণীয় পাথের পরিবর্তে আমি ব্যবহার করি 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__


এই হ 'ল যেতে উপায় হচ্ছে, এবং তারিখ উত্তর সবচেয়ে আপ, সব বাকি +1 চেষ্টা করার পরেFile.expand_path
SuckerForMayhem

আমি অবশ্যই উত্তরটি গ্রহণযোগ্যটির কাছে পছন্দ করি। আপনি ট্রেনে থাকলে বিভিন্ন Rails.root.joinউত্তরও কাজ করে।
nzifnab

14
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
  require file
end

এটি আপনার স্থানীয় মেশিনে এবং রিমোটের (হিরোকুর মতো) পুনরাবৃত্ত হয়ে কাজ করবে যা আপেক্ষিক পথ ব্যবহার করে না।


8

কারাগারে, আপনি এটি করতে পারেন:

Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }

আপডেট: স্ল্যাশগুলি সরানোর জন্য @ জিগনেশ গোহেলের পরামর্শ সহ সংশোধন করা হয়েছে।


যেহেতু Rails.rootএকটি হল Pathnameউদাহরণস্বরূপ, আপনি যে কোনো রুবি পরিবেশে এটা করতে পারেন, শুধু পাগল (বিশেষ দ্রষ্টব্য Rails.root.join('lib/ext/*.rb')সামান্য nicer সার্চ)
DMKE

সুপারিশের জন্য ধন্যবাদ; আমি আপনার মন্তব্য অন্তর্ভুক্ত সম্পাদনা।
ড্যান কোহন

Rails.root এর অধীন সাব-ডিরেক্টরিগুলির জন্য একটি ফরোয়ার্ড স্ল্যাশ (/) ব্যবহার করা উদাহরণস্বরূপ Rails.root.join('/lib')সঠিক পাথ তৈরি করে না। আমি Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
এইটিকে

@ জিগনেশ গোহেল আপনার পরামর্শ অনুসারে আমি স্ল্যাশগুলি সরিয়েছি, ধন্যবাদ।
ড্যান কোহন

3

আমি পার্টিতে কয়েক বছর দেরি করে চলেছি, তবে আমি অ্যাপ্লিকেশন / কর্মী / উদ্বেগের মধ্যে সমস্ত কিছু অন্তর্ভুক্ত করার জন্য রেলপথটি পেয়েছিলাম এমন এক-লাইন সমাধানের মতোই করছি:

Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }


-2

এবং কি সম্পর্কে require_relative *Dir['relative path']:?


1
প্রয়োজনীয় আপেক্ষিক একাধিক ফাইল নেবে না: রুবি-
ডক.আর.অর্গ.আওকোর

ঠিক আছে, তবে আমার উদাহরণে তা নয়। '*' আরেটি পরিবর্তন করে ১। এটি প্রয়োজনীয়_প্রাসঙ্গিক করার জন্য একাধিক কল হিসাবে কাজ করে।
আলেকসান্দার

1
'*' আভিজাত্যটিকে 1 এ পরিবর্তন করে - এর সাথে আপনি কী বোঝাতে চাইছেন? require_relative *Dir['*.rb']কাজ, যদি কেবল একটি রুবি-স্ক্রিপ্ট থাকে। কিন্তু যদি একাধিক রুবি স্ক্রিপ্ট পাওয়া যায়, আপনি পেতেrequire_relative': wrong number of arguments (4 for 1) (ArgumentError)
knut
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.