আরভিএম এবং rbenv আসলে কীভাবে কাজ করে?


140

আরভিএম এবং আরবেনভ আসলে কীভাবে কাজ করে তা সম্পর্কে আমি আগ্রহী।

স্পষ্টতই তারা রুবি এবং রত্নের বিভিন্ন সংস্করণের মধ্যে অদলবদল করে, তবে কীভাবে এটি অর্জিত হয়? আমি ধরে নিয়েছিলাম যে তারা কেবলমাত্র সিমলিংকগুলি আপডেট করছে, তবে কোডটি লিখে দেওয়া হয়েছে (এবং আমার অবশ্যই বাশ সম্পর্কে আমার জ্ঞানকে উচ্চমানের বলে স্বীকার করতে হবে) তারা এর চেয়ে আরও বেশি কিছু করছে বলে মনে হয়।

উত্তর:


241

সংক্ষিপ্ত ব্যাখ্যা: rbenv আপনার পরিবেশের মধ্যে hooking দ্বারা কাজ করে PATH। ধারণাটি সহজ, তবে শয়তানটি বিশদে রয়েছে; নীচে সম্পূর্ণ স্কুপ।

প্রথমত, rbenv সৃষ্টি শিম্স সব কমান্ড জন্য ( ruby, irb, rake, gemইত্যাদি) রুবি আপনার সমস্ত ইনস্টল করা সংস্করণ জুড়ে। এই প্রক্রিয়াটিকে রিহ্যাশিং বলা হয় । প্রতিবার আপনি রুবির একটি নতুন সংস্করণ ইনস্টল করেন বা কোনও কমান্ড সরবরাহকারী একটি রত্ন ইনস্টল করেন, rbenv rehashকোনও নতুন কমান্ড শিম্ম করা হয়েছে তা নিশ্চিত করতে চালান।

এই শিমগুলি একক ডিরেক্টরিতে থাকে ( ~/.rbenv/shimsডিফল্টরূপে)। Rbenv ব্যবহার করতে, আপনার কেবল সামনের দিকের শিমস ডিরেক্টরিটি যুক্ত করতে হবে PATH:

export PATH="$HOME/.rbenv/shims:$PATH"

তারপরে আপনি rubyযখনই কমান্ড লাইনটি থেকে চালাচ্ছেন বা কোনও স্ক্রিপ্ট চালাবেন যার শেবাং পড়েছে #!/usr/bin/env ruby, আপনার অপারেটিং সিস্টেমটি ~/.rbenv/shims/rubyপ্রথমে সন্ধান করবে এবং rubyআপনি ইনস্টল করা অন্য কার্যকর হতে পারে তার পরিবর্তে এটি চালাবে ।

প্রতিটি শিম একটি ক্ষুদ্র বাশ স্ক্রিপ্ট যা ঘুরে যায় rbenv exec। আপনার পথে rbenv সহ, irbসমান rbenv exec irb, এবং ruby -e "puts 42"এর সমতুল্য rbenv exec ruby -e "puts 42"

rbenv execকমান্ড পরিসংখ্যান প্রকাশ রুবি কি সংস্করণ আপনি ব্যবহার করতে চান, তাহলে সেই সংস্করণের জন্য সংশ্লিষ্ট কমান্ড রান। এখানে কীভাবে:

  1. যদি RBENV_VERSIONপরিবেশের পরিবর্তনশীল সেট করা থাকে তবে এর মানটি রুবি ব্যবহারের সংস্করণ নির্ধারণ করে।
  2. যদি বর্তমান ওয়ার্কিং ডিরেক্টরিতে কোনও .rbenv-versionফাইল থাকে তবে এর সামগ্রীগুলি RBENV_VERSIONপরিবেশ পরিবর্তনশীল সেট করতে ব্যবহৃত হয় ।
  3. যদি .rbenv-versionবর্তমান ডিরেক্টরিতে কোনও ফাইল না থাকে তবে rbenv কোনও .rbenv-versionফাইলের জন্য প্রতিটি প্যারেন্ট ডিরেক্টরিটি অনুসন্ধান করে যতক্ষণ না এটি আপনার ফাইল সিস্টেমের মূলটিকে আঘাত করে। যদি কোনওটি পাওয়া যায় তবে এর সামগ্রীগুলি RBENV_VERSIONপরিবেশের পরিবর্তনশীল সেট করতে ব্যবহৃত হয় ।
  4. যদি RBENV_VERSIONএখনও সেট না করা থাকে তবে rbenv ~/.rbenv/versionফাইলের বিষয়বস্তু ব্যবহার করে এটি সেট করার চেষ্টা করে ।
  5. যদি কোনও সংস্করণ কোথাও নির্দিষ্ট না করা থাকে, rbenv ধরে নেয় আপনি "সিস্টেম" রুবি — অর্থ যে কোনও সংস্করণ চলবে যদি rbenv আপনার পথে না থাকে।

(আপনি rbenv localকমান্ডটি দিয়ে একটি প্রকল্প-নির্দিষ্ট রুবি সংস্করণ সেট করতে পারেন যা .rbenv-versionবর্তমান ডিরেক্টরিতে একটি ফাইল তৈরি করে Similarly একইভাবে, rbenv globalকমান্ডটি ~/.rbenv/versionফাইলটি পরিবর্তন করে )

একটি সঙ্গে সশস্ত্র RBENV_VERSIONএনভায়রনমেন্ট ভেরিয়েবল, rbenv যোগ ~/.rbenv/versions/$RBENV_VERSION/binআপনার সামনে PATH, তারপর কমান্ড আর্গুমেন্ট প্রেরণ execs rbenv exec। ভাল খবর!

হুডের নীচে ঠিক কী ঘটে যায় তার বিশদ বিবরণের জন্য, RBENV_DEBUG=1রুবি কমান্ডটি সেট করে চালানোর চেষ্টা করুন । Rbenv দ্বারা চালিত প্রতিটি বাশ কমান্ড আপনার টার্মিনালে লেখা হবে।


এখন, rbenv শুধু সুইচিং সংস্করণের সাথে সংশ্লিষ্ট করা হয়, কিন্তু থাকা প্লাগইনগুলির একটি সমৃদ্ধ বাস্তু আপনার কাছ থেকে সবকিছু করতে সাহায্য করবে রুবি ইনস্টল করতে আপনার পরিবেশ স্থাপনের , "gemsets" পরিচালনার এবং এমনকি স্বয়ংক্রিয়bundle exec

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

প্রকাশ: আমি rbenv, রুবি-বিল্ড এবং rbenv-vars এর লেখক।


14
এত চমৎকার উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ।
সুপারলুমিনিয়ারি

2
বাহ, এমন একটি বোধগম্য এবং বোধগম্য ব্যাখ্যার জন্য ধন্যবাদ। একজন প্রাকৃতিক জন্মগত শিক্ষক।
racl101

আরে, স্যাম, যেহেতু এই উত্তরটি দুটি বছরের পুরানো, আপনি কি কোনও আপডেট করতে চান? সেই সময় থেকে অবশ্যই কিছুটা পরিবর্তিত হয়েছে rbenv এ।
নাকিলন

নাঃ। আমি দেখেছি সেরা হ্যাকারের বিবরণ। আমি মনে করি যে কেবলমাত্র আপডেটটি পরিবর্তনের দরকার তা হল রেবেভ-জেমসেটের লিঙ্কটি (লিঙ্কটি এখনও সেখানে আপনাকে পেয়ে যাবে It's এটি একটি পুনঃনির্দেশ থেকে কেবলমাত্র আরও একটি পদক্ষেপ)।
জেফ্রি 'জেফ' লিম

18

আমি একটি গভীর-নিবন্ধ লিখেছি: http://niczsoft.com/2011/11/hat-you-should-know-about-rbenv-and-rvm/

প্রাথমিক পার্থক্য হ'ল শেলের পরিবেশ পরিবর্তন করা হয়েছে:

  • আরভিএম: আপনি যখন রুবি পরিবর্তন করবেন তখন এটি পরিবর্তিত হবে।
  • rbenv: আপনি যখন একটি রুবি / মণি সম্পাদনযোগ্য চালাবেন তখন এটি পরিবর্তিত হবে।

আরভিএম সম্পর্কিত বিষয়টি হ'ল এটি রুবিসকে পরিচালনা করার পরে আরও অনেক কিছু কভার করে, এটি অন্য যে কোনও সরঞ্জামের চেয়ে অনেক বেশি রয়েছে (আরভিএম এবং আরবেএনভ ছাড়াও অন্যরা আছেন: https://twitter.com/#!/mpapis/ স্থিতি / 171714447910502401 )

ফ্রিনোড সার্ভারগুলিতে "#rvm" চ্যানেলে আইআরসি-তে পাওয়া তাত্ক্ষণিক সমর্থন সম্পর্কে ভুলে যাবেন না।


1
ধন্যবাদ, এটি সত্যই দুর্দান্ত যে উভয় সম্প্রদায়ের লোকেরা এতে জড়িত।
সুপারলুমিনারি

15

সুতরাং উপরের উত্তরের উত্তরের সংক্ষিপ্তসার হিসাবে, রুবি সংস্করণ নির্বাচন করা হলে আরভিএম এবং আরবেনভের মধ্যে প্রধান ব্যবহারিক পার্থক্য।

rbenv:

rbenv আপনার পথের শুরুতে একটি শিহর যুক্ত করে, রুবি একই নামের একটি কমান্ড। আপনি যখন rubyকোনও কমান্ড লাইনে টাইপ করেন তখন পরিবর্তে শিমটি চালানো হয় (কারণ এটি "রুবি" নামেও পরিচিত এবং পথে প্রথম আসে)। শিম কোনও পরিবেশের পরিবর্তনশীল বা .rbenv_versionফাইলের সন্ধান করে এটির জন্য রুবি কোন সংস্করণটি প্রেরণ করবে তা জানাতে।

RVM:

আরভিএম আপনাকে ডেকে সরাসরি রুবির সংস্করণ সেট করতে দেয় rvm use। উপরন্তু, এটি cdসিস্টেম কমান্ডকে ওভাররাইড করে । আপনি যখন cdকোনও ফোল্ডারে .rvmrcফাইল যুক্ত করেন তখন .rvmrcফাইলটির অভ্যন্তরে কোডটি কার্যকর করা হয়। এটি রুবি সংস্করণ বা আপনার অভিনব কোনও কিছু সেট করতে ব্যবহার করা যেতে পারে।

অন্যান্য পার্থক্য:

অবশ্যই অন্যান্য পার্থক্য আছে। আরভিএমের বাক্সের বাইরে রত্ন রয়েছে, আরবেনভের জন্য আরও কিছুটা হ্যাকিং প্রয়োজন (তবে বেশি নয়)। উভয়ই সমস্যার কার্যকরী সমাধান।


6

মূল পার্থক্যটি মনে হয় কখন এবং কীভাবে রুবি স্যুইচ করা হয় । রুবি সুইচড:

  • আরভিএমের জন্য ম্যানুয়ালি (আরভিএম ব্যবহার) বা স্বয়ংক্রিয়ভাবে ডিরেক্টরি পরিবর্তনের সময়
  • rbenv জন্য স্বয়ংক্রিয়ভাবে প্রতিবার একটি রুবি কমান্ড কার্যকর করা হয়

আরভিএম পরিবর্তিত cdকমান্ড এবং দ্বারা রুবির ম্যানুয়াল নির্বাচনের উপর নির্ভর করে rvm use। rbenv রুবি নির্বাচন করার জন্য ডিফল্ট প্রক্রিয়া হিসাবে সমস্ত বেসিক রুবি কমান্ডের জন্য মোড়ক বা "শিমস" ব্যবহার করে। আরভিএম মণি, রেক, রুবি, এর মতো বুনিয়াদি কমান্ড লাইন সরঞ্জামগুলির জন্য মোড়ক তৈরি করে। এগুলি ক্রোনজবসে উদাহরণস্বরূপ ব্যবহৃত হয় (দেখুন http://rvm.io/integration/cron/ ) তবে তারা রুবি সংস্করণটি স্যুইচ করার ডিফল্ট প্রক্রিয়া নয়।

সুতরাং উভয় পদ্ধতিই আদেশগুলি ওভাররাইট করে এবং মোড়ক ব্যবহার করে ডান রুবি সংস্করণটি "স্বয়ংক্রিয়ভাবে" নির্বাচন করে। আরভিএম সিডির মতো শেল কমান্ডকে ওভাররাইড করে। rbenv রুবি, আইআরবি, রেক এবং রত্নের মতো সমস্ত বেসিক রুবি কমান্ডকে ওভাররাইড করে।


5
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before

আপনাকে প্রায় দেয়:

< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc

এবং এটি পূর্বে:

$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin

প্রতি $PATH

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