কেন রুবি ১.৯.২ "মুছে ফেলেন?" LOAD_PATH থেকে, এবং বিকল্প কি?


154

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

স্থির হিসাবে, $: << "."সর্বত্র যুক্ত করা কাজ করে তবে অবিশ্বাস্যরূপে হ্যাকি মনে হয় এবং আমি এটি করতে চাই না। আমার রেকফাইলস 1.9.2+ সামঞ্জস্যপূর্ণ করার পছন্দের উপায় কি?

উত্তর:


141

এটিকে একটি "সুরক্ষা" ঝুঁকি বলে মনে করা হয়েছিল।

আপনি নিখুঁত পাথ ব্যবহার করে এটি কাছাকাছি পেতে পারেন

File.expand_path(__FILE__) et al

বা করছেন

require './filename' (ironically).

বা ব্যবহার করে

require_relative 'filename'

অথবা একটি "অন্তর্ভুক্ত" ডিরেক্টরি যুক্ত করুন

ruby -I . ...

বা একই, আইআরবি ব্যবহার করে;

$irb -I .

27
আমি ব্যবহার করে ক্ষতবিক্ষত require_relative। ধন্যবাদ।
জন ফেমেনেলা

11
এটি কি বেশিরভাগ ইউনিক্সের মতোই, এক্সিকিউটেবলের জন্য চলমান পথে বর্তমান ডিরেক্টরিটি অন্তর্ভুক্ত করে না?
অ্যান্ড্রু গ্রিম

5
require './filename'স্ক্রিপ্টটি যে ডিরেক্টরিতে থাকে সেই একই ডিরেক্টরিতে কর্মরত ডিরেক্টরি সেট করে যদি আপনার স্ক্রিপ্টটি কার্যকর করা হয়। মাল্টি ডিরেক্টরি প্রকল্পগুলিতে এটি প্রায়শই হয় না।
এমএক্সএলসিএল

34

এর দুটি কারণ রয়েছে:

  • দৃust়তা এবং
  • নিরাপত্তা

উভয়ই একই অন্তর্নিহিত নীতির উপর ভিত্তি করে: সাধারণভাবে, আপনার কোডটি চালিত হওয়ার পরে আপনি কেবল ডিরেক্টরি ডিরেক্টরি কী তা জানতে পারবেন না। যার অর্থ হ'ল, যখন আপনার যখন কোনও ফাইলের প্রয়োজন হয় এবং এটি বর্তমান ডিরেক্টরিতে থাকে তার উপর নির্ভর করে, আপনার কাছে সেই ফাইলটি থাকবে কিনা তা নিয়ন্ত্রণ করার কোনও উপায় নেই বা আপনি যে ফাইলটি আসবেন বলে আশা করছেন তা আসলে কিনা।


5
আমি মনে করি না যে দুটি ফাইল একে অপরের সাথে তুলনামূলকভাবে একই স্থানে থাকা অপরিহার্যভাবে একটি খারাপ প্রয়োজন। যদি এটি সত্য হয়, তবে আমাদের ডিরেক্টরিতে কোনও ব্যবহার থাকত না।
জন ফেমেনিলা 12

4
@ জন ফেমেনিেলা: একে অপরের সাথে সম্পর্কিত পথে ফাইলগুলি যুক্ত করার সাথে এর কী সম্পর্ক? প্রশ্ন তাদের আপেক্ষিক রাখার বিষয়ে ., বর্তমান ওয়ার্কিং ডিরেক্টরি হিসাবে। যদি ব্যবহারকারী cdকোনও ভিন্ন ডিরেক্টরিতে প্রবেশ করে, বর্তমান কার্যনির্বাহী ডিরেক্টরিটি পরিবর্তিত হয় এবং ব্যবহারকারী যখন আপনার স্ক্রিপ্টটি ডাকে তখন ব্যবহারকারী কোন ডিরেক্টরিতে উপস্থিত হয়েছিল তার উপর নির্ভর করে আপনি এখন require সম্পূর্ণ আলাদা ফাইল। আমি মনে করি না এটি একটি ভাল ধারণা।
জার্গ ডব্লু মিটাগ

একটি শালীন ইন্টারফেস বজায় রাখার জন্য, আপনার এটি করা উচিত? $: << File.dirname(__FILE__)
জোশুয়া গাল

4
@ জোশুয়া গাল: ব্যক্তিগতভাবে, আমি এটি পছন্দ করি না। (কিন্তু, আমার বড় কোড তাকান না দয়া করে কারণ এটি littered স্টাফ :-) যে ধরনের সহ)। আমি কেবল ভান করি যে libডিরেক্টরিটি রয়েছে $LOAD_PATHএবং তারপরে requireসমস্ত ফাইল সম্পর্কিত lib। অন্য কথায়: আমি কীভাবে $LOAD_PATHসঠিকভাবে সেট আপ করতে পারি তা নির্ধারণের জন্য প্রশাসকের কাছে রেখে দিয়েছি । আপনি যদি রুবিগেমস ব্যবহার করেন তবে এটি তুচ্ছ, কারণ রুবিগেমস স্বয়ংক্রিয়ভাবে এটি আপনার জন্য করে এবং আপনি যদি ডিবিয়ান প্যাকেজ ব্যবহার করেন তবে এটি প্যাকেজ রক্ষণাবেক্ষণের কাজ। সব মিলিয়ে মনে হচ্ছে এটি বেশ সুন্দরভাবে কাজ করেছে।
Jörg ডব্লু মিটাগ

8
@Joshua গাল: এছাড়াও, একটি সমভার সাজানোর অফ যেমন সরানোর .থেকে $LOAD_PATH, রুবি 1.9.2 প্রবর্তন require_relativeযা ... বিস্ময় ... requireবর্তমানে নির্বাহ ফাইলের অবস্থান SA ফাইল আপেক্ষিক (অর্থাত আপেক্ষিক File.dirname(__FILE__))।
Jörg ডব্লু মিটাগ

16

অন্যরা যেমন উত্তর দেয়, এটি একটি সুরক্ষা ঝুঁকিপূর্ণ কারণ .আপনার বোঝার পথটি বর্তমান কার্য-ডিরেক্টরিকে বোঝায় Dir.pwd, বর্তমান ফাইলটির ডিরেক্টরি বোঝাই হচ্ছে না। সুতরাং যে কেউ আপনার স্ক্রিপ্টটি সম্পাদন cdকরছে সে অন্য কোনও ডিরেক্টরিতে যুক্ত হয়ে এটিকে পরিবর্তন করতে পারে। ভাল না!

আমি __FILE__বিকল্প হিসাবে থেকে নির্মিত পুরো পথ ব্যবহার করছি ।

require File.expand_path(File.join(File.dirname(__FILE__), 'filename'))

বিপরীতে require_relative, এটি রুবি 1.8.7 এর সাথে পিছনে সামঞ্জস্যপূর্ণ।


4
এই প্রকরণটিও রয়েছে (যা আমি ব্যক্তিগতভাবে আরও বেশি পঠনযোগ্য বলে মনে করি): require Pathname.new(__FILE__).dirname + 'filename'
টাইলার রিক

8

ব্যবহার require_relative 'file_to_require'

1.8.7 এ প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত করতে এটি আপনার কোডটিতে ফেলে দিন:

unless Kernel.respond_to?(:require_relative)
  module Kernel
    def require_relative(path)
      require File.join(File.dirname(caller.first), path.to_str)
    end
  end
end

6

'।' আপনার পথটিকে দীর্ঘদিন ধরে ইউনিক্স বিশ্বে একটি খারাপ জিনিস হিসাবে বিবেচনা করা হচ্ছে (উদাহরণস্বরূপ, http://www.faqs.org/faqs/unix-phaq/faq/part2/section-13.html )। আমি ধরে নিই যে রুবি লোকেরা এটি না করার প্রজ্ঞায় প্ররোচিত হয়েছে।


3

আমি দু'টি জিনিস উপলব্ধি না করা পর্যন্ত এটি একটি বিস্ময়কর পরিবর্তন বলে মনে করেছি।

আপনি আপনার প্রোফাইলে (ইউনিক্স) এ রুবিলিবি সেট করতে পারেন এবং আপনি আগের মতো জীবন যাপন করতে পারেন:

export RUBYLIB="."

তবে উপরে উল্লিখিত হিসাবে, এটি করা দীর্ঘকালই অনিরাপদ হিসাবে বিবেচিত।

বেশিরভাগ ক্ষেত্রে আপনি নিজের রুবি স্ক্রিপ্টগুলিকে প্রিপেন্ডড 'দিয়ে কল করে সমস্যাগুলি এড়াতে পারেন।' যেমন ./scriptts/server।


3

জার্গ ডব্লু মিতাগ যেমন উল্লেখ করেছেন, আমি মনে করি আপনি যা ব্যবহার করতে চান তা require_relativeতাই আপনার প্রয়োজনীয় ফাইলটি requireঘোষণার উত্স ফাইলের সাথে সম্পর্কিত এবং বর্তমান কার্যকারিতা নয় working

আপনার নির্ভরতাগুলি আপনার রেক বিল্ড ফাইলের সাথে সম্পর্কিত হওয়া উচিত।

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