Directory LOAD_PATH (রুবি) তে একটি ডিরেক্টরি যুক্ত করা হচ্ছে


96

আমি বর্তমানে $ LOAD_PATH (বা $ :): এ কার্যকর করা ফাইলটির ডিরেক্টরি যুক্ত করার জন্য দুটি ব্যবহৃত কৌশল দেখেছি। আপনি যদি কোনও রত্নের সাথে কাজ না করে থাকেন তবে এটি করার সুবিধাটি আমি দেখতে পাচ্ছি। একজনকে অন্যটির চেয়ে আরও ভার্বোজ মনে হয়, স্পষ্টতই, তবে এর সাথে অন্যের সাথে যাওয়ার কোনও কারণ আছে কি?

প্রথম, ভার্বোজ পদ্ধতি (ওভারকিল হতে পারে):

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))

এবং আরও সোজা, দ্রুত এবং নোংরা:

$:.unshift File.dirname(__FILE__)

একে অপরের সাথে যাওয়ার কোনও কারণ?


4
একজন সামান্য এক বাগাড়ম্বরপূর্ণ কম বাগাড়ম্বরপূর্ণ সংস্করণ:File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
নাথন লং

কিভাবে "বাদে" ধারা সম্পর্কে? উপরের দুটিটি কীভাবে সমতুল্য হতে পারে?
ইনজিগার

যে কেউ এখানে এসেছেন এটি কীভাবে এটি ব্যবহার করবেন তা বোঝার চেষ্টা করার জন্য, এটি দুর্দান্ত রহস্যজনক। উদাহরণগুলির মধ্যে ডিরেক্টরিটির নামটি কোথা থেকে আসছে তা আমি দেখতে পাচ্ছি না। কেউ যদি এটি পরিষ্কার করে দিতে পারে তবে আমি প্রশংসা করব।
স্ল্যশেরজ

4
__dir__(রুবি ২.০ হিসাবে) ব্যবহার করা এগুলির যে কোনও একটি সংক্ষিপ্ত করে তুলতে পারে।
নাথান লং

উত্তর:


52

আমি বলব অন্যটির সাথে $:.unshift File.dirname(__FILE__)চলুন, কারণ আমি কোডটির চেয়ে কোডটিতে এর ব্যবহার বেশি দেখেছি $LOAD_PATHএবং এটিও খাটো!


আমি যখন রুবীর সাথে প্রথম শুরু করি, তখন আমি স্পষ্টতই ভেবেছিলাম যে $ LOAD_PATH আরও ভাল। তবে একবার আপনি প্রাথমিকের অবস্থা থেকে স্নাতক হয়ে গেলে আমি কেবলমাত্র $ LOAD_PATH ব্যবহার করব যদি আমি আমার কোডটি কোনও শিক্ষানবিশকে আরও পাঠযোগ্য করে তোলার চেষ্টা করতাম। মেহ এটি একটি বাণিজ্য বন্ধ। কোডটি কীভাবে "জনসাধারণ" হয় তার উপর নির্ভর করে, যতক্ষণ প্রত্যেকটির জন্য মেমরির ব্যবহার একই হয়, যা আমি এটি মূলত অনুমান করি।
বোল্ডার_রবি

9
আপনার প্রকল্পের জন্য আপনি যে স্টাইল গাইড অনুসরণ করেন তার উপর নির্ভর করে। জনপ্রিয় রুবি স্টাইল গাইড বলেছেন, "পার্ল-স্টাইলের বিশেষ ভেরিয়েবলগুলি (যেমন:, :, $ ;, ইত্যাদি) ব্যবহার করা থেকে বিরত থাকুন quite এগুলি বেশ ক্রিপ্টিক এবং ওয়ান-লাইন স্ক্রিপ্ট ব্যতীত অন্য কোনও কিছুতে নিরুত্সাহিত।"
ববমাগু

153

রুবি লোড পাথটি সাধারণত $ হিসাবে লিখিতভাবে দেখা যায়, তবে এটি সংক্ষিপ্ত হওয়ার কারণে এটি আরও ভাল করে না। আপনি যদি চতুরতার তুলনায় স্পষ্টতা পছন্দ করেন, বা যদি নিজের স্বার্থের জন্য ব্রেভিটি আপনাকে চুলকানি করে তোলে তবে আপনাকে অন্য কারও কারণেই এটি করার দরকার নেই। হ্যালো বলুন ...

$LOAD_PATH

... এবং বিদায় জানাতে ...

# I don't quite understand what this is doing...
$:

29
এছাড়াও, "$:" এর মতো স্ট্রিংগুলির জন্য এটি Google এর পক্ষে অনেক বেশি শক্ত যেখানে কেবলমাত্র চিহ্ন রয়েছে।
ডিএসিমন

24

আমি 'দ্রুত এবং নোংরা' পথে খুব বেশি পছন্দ করি না। রুবির নতুন যে কেউ যা ভাবছেন তা ভাবছেন $:.

আমি এটি আরও সুস্পষ্ট মনে করি।

libdir = File.dirname(__FILE__)
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)

বা যদি আমি পুরো পথটি সম্পর্কে চিন্তা করি ...

libdir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)

আপডেট 2009/09/10

দেরিতে আমি নিম্নলিখিতগুলি করে চলেছি:

$:.unshift(File.expand_path(File.dirname(__FILE__))) unless
    $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))

গিটহাব ব্রাউজ করার সময় আমি এটি বিভিন্ন রুবি প্রজেক্টের পুরো গোছাতে দেখেছি।

কনভেনশন বলে মনে হচ্ছে?


@ লুক এন্টিনস, এটি সত্যিই দুর্দান্ত তবে অ্যাপ্লিকেশনটিতে আমার "বুটস্ট্র্যাপ" লোড_পাথ কোথায় করা উচিত?
গসব্লুরিনিক

@ লিউসব্লুরিনিক আপনার কোষ / অ্যাপ্লিকেশনটির 'শীর্ষে' কাছাকাছি কোথাও, তবে এটি সত্যই নির্ভর করে। আপনার যদি এমন কোনও binফাইল থাকে যা সর্বদা আপনার সম্পর্কিত হয় codeএবং এটি কেবল কখনও binফাইল দ্বারা চালিত হয় ... বিনটিতে বুটস্ট্র্যাপ rap আপনার যদি কোনও লাইব্রেরি থাকে তবে lib/code.rbতার নীচে সমস্ত কিছুতে অ্যাক্সেস পেতে লাইব্রেরি কোডটির শীর্ষে বুটস্ট্র্যাপ করুন lib/code/। আশা করি এই ঘোড়দৌড় সাহায্য করবে!
লূক অ্যান্টিনস

4
রুবকপ আমাকে অবহিত __dir__করে যা বর্তমান ফাইলের ডিরেক্টরিতে একটি পথ পেতে ব্যবহার করা যেতে পারে।
রাফেল

8

আপনি যদি script/consoleআপনার রেলস প্রজেক্টটি টাইপ করেন এবং প্রবেশ করেন $:, আপনি এমন একটি অ্যারে পাবেন যাতে রুবি লোড করার জন্য প্রয়োজনীয় সমস্ত ডিরেক্টরি অন্তর্ভুক্ত থাকে। এই সামান্য অনুশীলন থেকে নেওয়া তা $:হ'ল অ্যারে। এটি তাই, আপনি unshiftপদ্ধতি বা <<অপারেটরের সাথে অন্যান্য ডিরেক্টরি প্রিপেন্ড করার মতো কাজ করতে পারেন । যেমন আপনি আপনার বিবৃতিতে আবশ্যক $:এবং $LOAD_PATHএকইরকম।

আপনি উল্লিখিত হিসাবে দ্রুত এবং নোংরা উপায় এটির সাথে অসুবিধাটি হ'ল: যদি আপনার বুট পথে ডিরেক্টরি ইতিমধ্যে থাকে তবে এটি নিজেই পুনরাবৃত্তি করবে।

উদাহরণ:

আমার একটি প্লাগইন রয়েছে যা আমি টোডো নামে তৈরি করেছি। আমার ডিরেক্টরিটি এর মতো কাঠামোযুক্ত:

/ --- বিক্রেতা
  |
  | --- / প্লাগইন
        |
        | --- / টোডো
              |
              | --- / lib
                    |
                    | --- / অ্যাপ্লিকেশন
                          |
                          | --- / মডেল
                          | --- / নিয়ন্ত্রণকারী
              |
              | --- / রেল
                    |
                    | --- init.rb

Init.rb ফাইলে আমি নিম্নলিখিত কোডটি প্রবেশ করলাম:

## In vendor/plugins/todo/rails/init.rb
    %w{ models controllers models }.each do |dir|
      path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
      $LOAD_PATH << path
      ActiveSupport::Dependencies.load_paths << path
      ActiveSupport::Dependencies.load_once_paths.delete(path)
    end 

আমি কীভাবে কোড ব্লককে ব্লকের অভ্যন্তরে স্ট্রিংগুলির 'মডেল', 'নিয়ন্ত্রণকারী' এবং 'মডেলগুলি' র ক্রিয়া সম্পাদন করতে বলি, যেখানে আমি 'মডেলগুলি' পুনরাবৃত্তি করি। (এফওয়াইআই, %w{ ... }রুবিকে স্ট্রিংগুলির একটি অ্যারে ধরে রাখতে বলার আরও একটি উপায়)। আমি যখন দৌড়ান script/console, আমি নিম্নলিখিত টাইপ করি:

>> puts $:

এবং আমি এটি টাইপ করি যাতে স্ট্রিংয়ের সামগ্রীগুলি পড়া আরও সহজ হয়। আমি যে আউটপুট পাই তা হ'ল:

...
...
/
/
/

আপনি দেখতে পাচ্ছেন, যদিও বর্তমানে এটি কাজ করছি এমন একটি প্রকল্প ব্যবহার করার সময় আমি এটি তৈরি করতে পারার মতো সাধারণ উদাহরণ, যদি আপনি সতর্ক না হন তবে দ্রুত এবং নোংরা পথটি পুনরাবৃত্তির পথে পরিচালিত করবে। দীর্ঘতর পথটি পুনরাবৃত্ত পাথগুলি পরীক্ষা করবে এবং তা নিশ্চিত হবে না don't

যদি আপনি একজন অভিজ্ঞ রেল প্রোগ্রামার হন তবে আপনি সম্ভবত যা করছেন তার খুব সম্ভবত ধারণা থাকতে পারে এবং সম্ভবত পুনরাবৃত্তি করার পথটি ভুল করবেন না। আপনি যদি নবাগত হন তবে আপনি কী করছেন তা আপনি যতক্ষণ না বুঝতে পারছেন ততক্ষণ আমি দীর্ঘ পথ ধরে যাব।


আপনার প্রতিক্রিয়া খুব সহায়ক এবং ভাল ব্যাখ্যা। প্রস্তাবিত সম্পাদনা: পদ্ধতিটি load_pathsএবং load_once_paths.deleteহ্রাস করা হয়েছে। তাদের উল্লেখ করা লাইনের আপডেট করতে সহায়তা করা হবে: ActiveSupport::Dependencies.autoload_paths << path ActiveSupport::Dependencies.autoload_once_paths.delete(path)
উজ্জ্বার

8

সেরা যখন আরএসপেক ব্যবহার করার সময় আপেক্ষিক পাথ দিয়ে একটি দির যোগ করার জন্য এসেছি। আমি এটি যথেষ্ট ভার্বোজ পাই তবে এটি একটি দুর্দান্ত একটি লাইনার।

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))

1

একটি রত্ন রয়েছে যা আপনাকে ভাল এবং ক্লিনার কোড দিয়ে আপনার লোড পাথ সেটআপ করতে দেয়। এটি দেখুন: https://github.com/nayyara-samuel/load-path

এটিতেও ভাল ডকুমেন্টেশন রয়েছে


-2

আমি জানি যে এই প্রশ্নটি প্রথম জিজ্ঞাসা করার পরে অনেক দিন হয়েছে, তবে আমার একটি অতিরিক্ত উত্তর রয়েছে যা আমি ভাগ করতে চাই।

আমার বেশ কয়েকটি রুবি অ্যাপ্লিকেশন রয়েছে যা বেশ কয়েক বছর ধরে অন্য প্রোগ্রামার দ্বারা বিকাশ করা হয়েছিল এবং তারা একই অ্যাপ্লিকেশনগুলিতে বিভিন্ন অ্যাপ্লিকেশনটিতে পুনরায় ব্যবহার করে যদিও তারা একই ডেটাবেস অ্যাক্সেস করতে পারে। যেহেতু এটি ডিআরওয়াই বিধি লঙ্ঘন করেছে, তাই আমি রুবি অ্যাপ্লিকেশনগুলির দ্বারা ভাগ করে নেওয়ার জন্য একটি ক্লাস লাইব্রেরি তৈরি করার সিদ্ধান্ত নিয়েছি। আমি এটি মূল রুবি লাইব্রেরিতে রাখতে পারতাম, তবে এটি সাধারণ কোডবেসে কাস্টম কোডটি লুকিয়ে রাখত যা আমি করতে চাই না।

ইতিমধ্যে সংজ্ঞায়িত নাম "প্রোফাইল.rb" এবং আমি যে ক্লাসটি ব্যবহার করছিলাম তার মধ্যে আমার একটি নাম বিরোধ ছিল I আমি সাধারণ কোড লাইব্রেরি তৈরির চেষ্টা না করা পর্যন্ত এই বিরোধ কোনও সমস্যা ছিল না। সাধারণত, রুবি প্রথমে অ্যাপ্লিকেশনগুলির অবস্থান অনুসন্ধান করে, তারপরে $ LOAD_PATH অবস্থানগুলিতে যায়।

অ্যাপ্লিকেশন_কন্ট্রোলআরআরবি আমার তৈরি করা ক্লাসটি খুঁজে পেল না এবং মূল সংজ্ঞাটিতে একটি ত্রুটি ছুঁড়েছে কারণ এটি কোনও শ্রেণি নয়। যেহেতু আমি অ্যাপ্লিকেশনটির অ্যাপ্লিকেশন / মডেল বিভাগ থেকে শ্রেণি সংজ্ঞাটি সরিয়েছি, রুবি সেখানে এটি খুঁজে পেল না এবং রুবি পথগুলিতে এটি সন্ধান করতে গিয়েছিল।

সুতরাং, আমি যে লাইব্রেরি ডিরেক্টরিটি ব্যবহার করছিলাম সেগুলির পাথ অন্তর্ভুক্ত করার জন্য আমি $ LOAD_PATH ভেরিয়েবলটি সংশোধন করেছি। এটি পরিবেশগত.আরবি ফাইলে শুরু করার সময় করা যেতে পারে।

এমনকি অনুসন্ধানের পথে নতুন ডিরেক্টরি যুক্ত হওয়ার পরেও রুবি একটি ত্রুটি ফেলছিল কারণ এটি প্রথমে সিস্টেম-সংজ্ঞায়িত ফাইলটিকে প্রথমে গ্রহণ করছিল। Path LOAD_PATH ভেরিয়েবলের সন্ধানের পথটি প্রথমে রুবি পাথ অনুসন্ধান করে।

সুতরাং, আমাকে অনুসন্ধানের অর্ডারটি পরিবর্তন করতে হবে যাতে অন্তর্নির্মিত লাইব্রেরিগুলি অনুসন্ধান করার আগে রুবি আমার সাধারণ লাইব্রেরিতে ক্লাসটি খুঁজে পেয়েছিল।

এই কোডটি পরিবেশ.আরবি ফাইলে এটি করেছে:

Rails::Initializer.run do |config|

* * * * *

path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)

* * * * *

end

আমি মনে করি না আপনি এই স্তরের আগে প্রদত্ত উন্নত কোডিং কনস্ট্রাক্টসগুলির কোনওটি ব্যবহার করতে পারেন তবে আপনি যদি আপনার অ্যাপ্লিকেশনটিতে প্রারম্ভিক সময়ে কিছু সেটআপ করতে চান তবে এটি ঠিক কাজ করে। আপনাকে নতুন vari LOAD_PATH ভেরিয়েবলের মূল ক্রমটি বজায় রাখতে হবে যখন এটি আবার নতুন ভেরিয়েবলটিতে যুক্ত হবে অন্যথায় প্রধান রুবি শ্রেণীর কিছু হারিয়ে যায়।

Application_controller.rb ফাইলটিতে আমি কেবল একটি ব্যবহার করি

require 'profile'
require 'etc' #etc

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

আমার জন্য, এটিই আমি সমাধানটি সন্ধান করছি এবং আমি ভেবেছিলাম তথ্যটি পাশ করার জন্য আমি এই উত্তরটিতে যুক্ত করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.