রুবিতে নির্ভরতা পরিচালনা করার জন্য সাধারণত রুবি এবং রত্ন সংস্করণগুলি নির্দিষ্ট করা জড়িত যার উপর আমাদের প্রকল্প নির্ভর করে। রুবির সাথে কাজ করার অভিজ্ঞতায়, ডিবাগিং নির্ভরতা আমার সবচেয়ে বড় চ্যালেঞ্জগুলির মধ্যে একটি। ব্যর্থতা সাধারণ নয় কারণ অনেক কিছু "শুধু কাজ করে"; যাইহোক, যখন জিনিসগুলি ভুল হয়ে যায়, তখন সেগুলি ডিবাগ এবং ঠিক করা সাধারণত অপ্রয়োজনীয়ভাবে কঠিন হয়৷ এই নিবন্ধে, আমি রুবিতে নির্ভরতা ব্যবস্থাপনার সাথে জড়িত অংশগুলি তুলে ধরব। এটি এই অদ্ভুত সমস্যাগুলি ঘটলে ডিবাগ করতে সহায়তা করবে৷
রুবি কোড লোড হচ্ছে
৷
ডিফল্টরূপে, রুবি ভাষা অন্য কোথাও সংজ্ঞায়িত কোড লোড করার জন্য দুটি প্রধান পদ্ধতি প্রদান করে:load
&require
.
load 'json.rb'
require 'json.rb'
require_relative 'json.rb'
উভয় লোডিং পদ্ধতিই পরম এবং আপেক্ষিক উভয় পাথকে যুক্তি হিসাবে গ্রহণ করে। যাইহোক, দুটি পার্থক্যকারী কারণ রয়েছে:
-
load
করতে একাধিক কল ফাইলটি পুনরায় কার্যকর করবে, যেখানে একাধিক কলrequire
করতে হবে ফাইল পুনরায় চালানো হবে না; পরিবর্তে, এটিfalse
ফেরত দেবে . -
load
করতে কল করে শুধুমাত্র পরম এবং আপেক্ষিক পাথ সমাধান করে।require
কল করুন$LOAD_PATH
-এ চেক আপ করে যখন পথটি একটি পরম পথে স্থির হয় না।
একটি তৃতীয় রূপ হল require_relative
, যা রুবি প্রক্রিয়ার কার্যকারী ডিরেক্টরির পরিবর্তে বর্তমান ফাইলের অবস্থানের সাথে সম্পর্কিত কোডের প্রয়োজনের জন্য আপেক্ষিক পাথ ব্যবহার করে৷
Rbenv
একটি সংস্করণ ব্যবস্থাপক হল একটি টুল যা পরিচালনা করতে এবং সহজেই আমাদের দোভাষীর সংস্করণগুলির মধ্যে স্যুইচ করতে ব্যবহৃত হয় (এই ক্ষেত্রে, রুবি) এবং আমাদের প্রকল্পের জন্য সংশ্লিষ্ট রত্নগুলি খুঁজে পেতে অবস্থান নির্দিষ্ট করে৷ সংস্করণ পরিচালকরা মূলত ভাষা অজ্ঞেয়মূলক সরঞ্জাম, এবং বিভিন্ন ভাষায় তাদের নিজ নিজ বাস্তবায়ন রয়েছে, যেমন Nvm, Node.js-এর জন্য n, Python-এর জন্য pyenv এবং রুবির জন্য Rbenv, rvm এবং chruby। এখন, rbenv
নেওয়া যাক একটি ঘূর্ণনের জন্য, আমরা করব?
রুবি সংস্করণ ইনস্টল করুন
৷
আমরা rbenv install
কমান্ডটি ব্যবহার করি রুবি-এর যেকোনো সংস্করণ ইনস্টল করতে:
# Install ruby 2.6.1
$ rbenv install 2.6.1
Downloading openssl-1.1.1i.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242
Installing openssl-1.1.1i...
Installed openssl-1.1.1i to /home/directory/.rbenv/versions/2.6.1
Downloading ruby-2.6.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.bz2
Installing ruby-2.6.1...
ruby-build: using readline from homebrew
Installed ruby-2.6.1 to /home/directory/.rbenv/versions/2.6.1
# Check Installation
$ rbenv versions # Shows all versions installed.
system
2.6.1
# Lookup versions available for installation
$ rbenv install -L
1.8.5-p52
1.8.5-p113
1.8.5-p114
...
2.7.0-rc1
2.7.0-rc2
2.7.0
...
truffleruby+graalvm-20.1.0
truffleruby+graalvm-20.2.0
truffleruby+graalvm-20.3.0
# The full list above amounts to about 500 versions, scrolling through the entire list is a lot.
# The command below is an easy shortcut to find your specific version with fzf.
$ rbenv install `rbenv install -L | fzf`
সংস্করণগুলির মধ্যে পাল্টান
রুবির সংস্করণগুলির মধ্যে কীভাবে স্যুইচ করতে হয় তা শনাক্ত করার জন্য অনেকগুলি উপায় রয়েছে; সর্বদা, rbenv
নিম্নলিখিতগুলি করে:
-
RBENV_VERSION
পরীক্ষা করে . - একটি
.ruby-version
অনুসন্ধান করে ফাইলটি স্ক্রিপ্টের ডিরেক্টরিতে এবং এটির প্যারেন্ট যতক্ষণ না এটি রুট ডিরেক্টরিতে আঘাত করে। - একটি
.ruby-version
অনুসন্ধান করে$PWD
-এ ফাইল এবং এর মূল ডিরেক্টরিগুলি যতক্ষণ না এটি রুট ডিরেক্টরিতে আঘাত করে। - গ্লোবাল ফাইল
~/.rbenv/version
ব্যবহার করে .
অগ্রাধিকার উপরে থেকে নীচে যায়. ~/.rbenv/version
এটি চূড়ান্ত ফলব্যাক এবং বিশ্বব্যাপী সংস্করণ হিসাবে বিবেচিত। নীচে দেখুন:
# Inside First Project Root
# Select ruby version for project
$ touch .ruby-version && echo "2.7.1" >> .ruby-version
# Verify selected version
$ ruby --version
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin20] # Result
$ rbenv version
2.7.1 (set by /path/to/current/directory/.ruby-version) # Result
# Change selected version
$ : >> .ruby-version && echo "2.6.1" >> .ruby-version
# Verify selection change
$ ruby --version
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin20] # Result
$ rbenv version
2.6.1 (set by /path/to/current/directory/.ruby-version)
# Change selection with RBENV_VERSION while .ruby-version is present
$ export RBENV_VERSION=2.5.1
# Verify selection change
# .ruby-version is ignored.
$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin20] # Result
$ rbenv version
2.5.1 (set by RBENV_VERSION environment variable) # Result
# Change to a version that is not installed & remove RBENV_VERSION
$ unset RBENV_VERSION & : >> .ruby-version && echo "2.4.1" >> .ruby-version
# Verify selection change
$ ruby --version
rbenv: version `2.4.1' is not installed (set by full/path/to/current/directory/.ruby-version) # Result
শিমস এবং রিহ্যাশিং
rbenv
ডিবাগ করতে সক্ষম হতে এই দুটি ধারণা সঠিকভাবে বোঝা দরকার কার্যকরভাবে।
শিমস হল হালকা ওজনের ব্যাশ স্ক্রিপ্ট যা আপনার PATH
-এ বিদ্যমান কমান্ডগুলিকে আটকাতে এবং কার্যকর করার জন্য উপযুক্ত সংস্করণে রুট করতে। একটি উচ্চ স্তরে, প্রতিটি কমান্ড (যেমন, rspec
) rbenv exec rspec
-এ অনুবাদ করা হয়েছে . নিচে বিস্তারিত দেখুন।
প্রথমে, rbenv
সমস্ত কমান্ডের জন্য একটি শিম তৈরি করে (rspec
, bundle
, ইত্যাদি) সমস্ত ইনস্টল করা রুবি সংস্করণ জুড়ে সিএলআই-তে কলগুলিকে বাধা দেওয়ার জন্য সংস্করণ নির্বিশেষে। এই শিমগুলি ~/.rbenv/shims
এ পাওয়া যাবে . প্রতিটি শিমে একই ব্যাশ স্ক্রিপ্ট রয়েছে, যেমনটি নীচে দেখানো হয়েছে:
#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x
program="${0##*/}"
if [ "$program" = "ruby" ]; then
for arg; do
case "$arg" in
-e* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export RBENV_DIR="${arg%/*}"
break
fi
;;
esac
done
fi
export RBENV_ROOT="/home/directory/.rbenv"
exec "/usr/local/Cellar/rbenv/1.1.2/libexec/rbenv" exec "$program" "$@"
পরবর্তীতে, উপরের স্ক্রিপ্টটি মোটামুটিভাবে নিম্নলিখিতটিতে অনুবাদ করে:
- যদি প্রোগ্রামের নাম হয়
ruby
একটি যুক্তি-e
সহ ,-
rbenv exec ruby <args>
-এ অনুবাদ করুন
-
- যদি প্রোগ্রামের নাম হয়
ruby
একটি স্ক্রিপ্টের পথ সহ,-
RBENV_DIR
সেট করুন স্ক্রিপ্টের ডিরেক্টরিতে। এটিrbenv
সক্ষম করে.ruby-version
অনুসন্ধান করতে$PWD
-এর আগে স্ক্রিপ্টের ডিরেক্টরিতে . যদি একটি.ruby-version
উভয় স্থানেই নির্দিষ্ট করা হয়েছে,rbenv
স্ক্রিপ্টের ডিরেক্টরি নির্বাচন করে।
-
- যদি প্রোগ্রামের নাম রুবি না হয়,
- এ অনুবাদ করুন
rbenv exec <program-name> <args>
.
- এ অনুবাদ করুন
অবশেষে, rbenv exec <command-name> <args>
RBENV_VERSION
চেক করে কমান্ডটি পাস করার জন্য সঠিক সংস্করণটি সনাক্ত করে পরিবেশ সূচক. মনে রাখবেন, RBENV_VERSION
উপরে সংজ্ঞায়িত অ্যালগরিদম দ্বারা সেট করা হয়৷
আপনার PATH
এ শিমস prepended করা আবশ্যক; এটি নিশ্চিত করে যে তারা আপনার রুবি এক্সিকিউটেবলের যোগাযোগের প্রথম পয়েন্ট এবং সঠিকভাবে বাধা দিতে পারে। আপনার PATH
বোঝার জন্য আমি সবচেয়ে ভাল উপায় খুঁজে পেয়েছি সেটআপ করুন এবং আপনার শিমগুলি সঠিকভাবে বাধা দিচ্ছে কিনা তা নিম্নরূপ:
$ which -a bundle
/path/to/home/.rbenv/shims/bundle
/usr/bin/bundle
which -a bundle
:এটি আপনার PATH
দিয়ে সহজভাবে দেখায় এবং যে ক্রমে এটি পাওয়া যায় সেই ক্রমে প্রিন্ট করে, অবস্থান যেখানে bundle
পাওয়া যাবে. যদি ~/.rbenv/shims
-এ কিছুর আগে কিছু প্রিন্ট করা হয় , এর মানে আপনার শিমগুলি সঠিকভাবে সেট আপ করা হয়নি। rbenv which bundle
এটি প্রকাশ করবে না কারণ কমান্ডটি rbenv
এর প্রসঙ্গে কাজ করে আপনার PATH
অনুসন্ধান করা হচ্ছে না .
রিহ্যাশিং হল শিমস তৈরির প্রক্রিয়া। আপনি যখন সদ্য একটি রুবি রত্ন ইনস্টল করেন যা একটি এক্সিকিউটেবল প্রদান করে, যেমন rspec
, আপনাকে rbenv rehash
চালাতে হবে শিম তৈরি করতে যাতে পরবর্তী কলগুলি rspec
-এ আসে rbenv
দ্বারা আটকানো যেতে পারে এবং উপযুক্ত রুবি সংস্করণে চলে গেছে।
Rubygems
এর পরেই রয়েছে রুবিজেমস। এটি অফিসিয়াল রুবি সাইট থেকে পাওয়া যায়। RubyGems হল একটি রুবি প্যাকেজিং সিস্টেম যা লাইব্রেরি তৈরি, শেয়ারিং এবং ইনস্টলেশনের সুবিধার্থে ডিজাইন করা হয়েছে; কিছু উপায়ে, এটি একটি ডিস্ট্রিবিউশন প্যাকেজিং সিস্টেম, বলুন, apt-get এর মতো, কিন্তু রুবি সফ্টওয়্যারকে লক্ষ্য করে। RubyGems হল রত্ন ভাগ করার ডি-ফ্যাক্টো পদ্ধতি। এগুলি সাধারণত ~/.rbenv/versions/{version-number}/lib/ruby/gems/{minor-version}/
এ ইনস্টল করা হয় , বা এর বৈকল্পিক, কোন সংস্করণ ম্যানেজার ব্যবহার করা হয় তার উপর নির্ভর করে। রুবির ডিফল্ট প্রয়োজনীয় পদ্ধতি Kernel.require
Gems ইনস্টলেশন ডিরেক্টরি থেকে রত্ন লোড করার জন্য কোন প্রক্রিয়া প্রদান করে না। RubyGems বানর-প্যাচ Kernel.require
প্রতি
- প্রথমে,
$LOAD_PATH
-এ রত্ন খুঁজুন . - যদি না পাওয়া যায়,
GEMS INSTALLATION DIRECTORY
এ রত্ন খুঁজুন .- একবার পাওয়া গেলে,
$LOAD_PATH
-এ পাথ যোগ করুন .
- একবার পাওয়া গেলে,
এটি "নেটিভলি" কাজ করে কারণ রুবি 1.9 সংস্করণ থেকে ডিফল্টরূপে RubyGems এর সাথে এসেছে; পূর্ববর্তী রুবি সংস্করণগুলির জন্য RubyGems ম্যানুয়ালি ইনস্টল করা প্রয়োজন। যদিও এটি স্থানীয়ভাবে কাজ করে, ডিবাগ করার সময় এই পার্থক্যটি জানাও গুরুত্বপূর্ণ৷
একটি রত্ন একটি নির্দিষ্ট সমস্যা সমাধান করতে ব্যবহৃত সম্পর্কিত কোডের একটি গুচ্ছ। একটি রত্ন ইনস্টল করুন এবং রত্ন পরিবেশ সম্পর্কে তথ্য নিন নিম্নরূপ:
$ gem install gemname
$ gem env
RubyGems Environment:
- RUBYGEMS VERSION: 3.1.2
- RUBY VERSION: 2.7.1 (2020-03-31 patchlevel 83) [x86_64-darwin20]
- INSTALLATION DIRECTORY: /path/to/home/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0
- USER INSTALLATION DIRECTORY: /path/to/home/.gem/ruby/2.7.0
- RUBY EXECUTABLE: /path/to/home/.rbenv/versions/2.7.1/bin/ruby
- GIT EXECUTABLE: /usr/bin/git
- EXECUTABLE DIRECTORY: /path/to/home/.rbenv/versions/2.7.1/bin
- SPEC CACHE DIRECTORY: /path/to/home/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /path/to/home/.rbenv/versions/2.7.1/etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-darwin-20
- GEM PATHS:
- /path/to/home/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0
- /path/to/home/.gem/ruby/2.7.0
- GEM CONFIGURATION:
...
- REMOTE SOURCES:
- https://rubygems.org/
- SHELL PATH:
- /path/to/home/.rbenv/versions/2.7.1/bin
কিভাবে RubyGems এই সমস্যার সমাধান করে? এটি বানর Kernel
প্যাচ করে এর নিজস্ব require
সিস্টেমের প্রয়োজন পদ্ধতি এই ইন-প্লেস দিয়ে, যখন require honeybadger
বলা হয়, এটি honeybadger.rb
এর জন্য রত্ন ফোল্ডারের মাধ্যমে অনুসন্ধান করে এবং পাওয়া গেলে মণি সক্রিয় করে।
উদাহরণস্বরূপ, require 'honeybadger'
নিম্নলিখিত অনুরূপ কিছু উত্পাদন করে:
spec = Gem::Specification.find_by_path('honeybadger')
spec.activate
একটি রত্ন সক্রিয় করার অর্থ হল এটিকে $LOAD_PATH
-এ রাখা৷ . RubyGems এছাড়াও রত্ন নিজেই ডাউনলোড করার আগে একটি রত্ন নির্ভরতা ডাউনলোড করতে সাহায্য করে৷
এছাড়াও, Rubygems একটি চমৎকার বৈশিষ্ট্য সহ জাহাজে পাঠায় যা আপনাকে gem open <gem-name>
দিয়ে সংশ্লিষ্ট রত্ন এর ডিরেক্টরি খুলতে সক্ষম করে।; উদাহরণস্বরূপ,
এটি আমাদের অ্যাপের উল্লেখ করা রত্নটির নির্দিষ্ট সংস্করণটি সহজেই খুঁজে/ট্রেস করতে দেয়।
বান্ডলার
এই স্তরে, বান্ডলার আমাদের সহজেই আমাদের সমস্ত প্রকল্প নির্ভরতা নির্দিষ্ট করতে এবং ঐচ্ছিকভাবে প্রতিটির জন্য একটি সংস্করণ নির্দিষ্ট করতে সহায়তা করে। তারপর, এটি আমাদের রত্নগুলি সমাধান করে, সেইসাথে এটি এবং এর নির্ভরতাগুলিকে ইনস্টল করে। বাস্তব-বিশ্বের অ্যাপ্লিকেশন তৈরি করা প্রি-বান্ডলার অনেক চ্যালেঞ্জ নিয়ে এসেছিল, যেমন নিম্নলিখিত:
- আমাদের অ্যাপ্লিকেশনগুলি অসংখ্য নির্ভরতা সহ বিদ্যমান, এবং এই নির্ভরতাগুলির অন্যান্য বিভিন্ন নির্ভরতা এবং তাদের নিজস্ব সংস্করণ রয়েছে। একটি রত্নটির ভুল সংস্করণ ইনস্টল করা আমাদের অ্যাপটি সহজেই ভেঙে ফেলবে এবং এই সমস্যার সমাধান করতে অনেক কান্না জড়িত৷
- এছাড়া, আমাদের দুইটি (2) নির্ভরতা একই তৃতীয়-স্তরের নির্ভরতাকে নির্দেশ করতে পারে। সামঞ্জস্য খুঁজে পাওয়া একটি সমস্যা ছিল, এবং যদি থাকে তবে এটি একটি সমস্যা ছিল৷
- যেখানে আমাদের একই মেশিনে একাধিক অ্যাপ্লিকেশন রয়েছে, বিভিন্ন নির্ভরতা সহ, আমাদের অ্যাপ্লিকেশনটি মেশিনে ইনস্টল করা যে কোনও রত্ন অ্যাক্সেস করতে পারে, যা সর্বনিম্ন বিশেষাধিকারের নীতির বিরুদ্ধে যায় এবং আমাদের অ্যাপ্লিকেশনটিকে মেশিনে ইনস্টল করা সমস্ত রত্নগুলির কাছে প্রকাশ করে, নির্বিশেষে তারা দূষিত কিনা।
বান্ডলার তিনটি সমস্যার সমাধান করে এবং নিম্নলিখিতগুলি করে আমাদের অ্যাপ নির্ভরতাগুলি পরিচালনা করার একটি বুদ্ধিমান উপায় দেয়৷
বান্ডলার নির্ভরতা সমাধান করে এবং একটি লকফাইল তৈরি করে:
# Gemfile
gem 'httparty'
যদি আমরা bundle
চালাই অথবা bundle install
, এটি লকফাইল তৈরি করবে:
GEM
specs:
httparty (0.18.1)
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2020.1104)
multi_xml (0.6.0)
PLATFORMS
ruby
DEPENDENCIES
httparty
BUNDLED WITH
2.1.4
উপরের থেকে, বান্ডলারটি httparty
এর সংস্করণ তৈরি করে ইনস্টল করার জন্য, সেইসাথে Gemfile.lock.
-এ এর নিজস্ব নির্ভরতা এই ফাইলটি আমাদের অ্যাপ নির্ভরতার ব্লুপ্রিন্ট এবং সংস্করণ নিয়ন্ত্রণে চেক করা উচিত। এটি নিশ্চিত করে যে আমাদের প্রকল্প নির্ভরতা পরিবেশ জুড়ে সামঞ্জস্যপূর্ণ (উন্নয়ন, মঞ্চায়ন বা উৎপাদন)।
বান্ডলার নির্ভরতাগুলির মধ্যে সামঞ্জস্যের সমাধান করে
এটি httparty
এর নির্ভরতা সমাধান করে এর নির্ভরতাগুলির জন্য একটি উপযুক্ত সংস্করণ খুঁজে বের করে এবং তাদের নির্দিষ্ট করে। Bundler এছাড়াও রত্ন মধ্যে নির্ভরতা সমাধান করার চেষ্টা করে. উদাহরণস্বরূপ,
# Gemfile
gem 'httparty' # That relies on gem 'mime-types', '>= 3.0.1, < 4.0.1'
gem 'rest-client' # That relies on gem 'mime-types', '>= 2.0.1, < 3.0'
উপরের উদাহরণটি স্বেচ্ছাচারী এবং এর ফলে একটি ত্রুটি দেখা দেবে, যেমন নিম্নলিখিত:
Bundler could not find compatible versions for gem "mime-types":
In Gemfile:
httparty was resolved to 0.18.1, which depends on
mime-types ('>= 3.0.1, < 4.0.1')
rest-client was resolved to 2.0.4, which depends on
mime-types ('>= 2.0.1, < 3.0')
এর কারণ হল দুটি রত্ন নির্ভরতা যা সামঞ্জস্যপূর্ণ নয় এবং স্বয়ংক্রিয়ভাবে সমাধান করা যায় না৷
বান্ডলার ইনস্টল করা রত্নগুলিতে অ্যাক্সেস সীমাবদ্ধ করে কিন্তু আমাদের Gemfile
-এ নির্দিষ্ট করা নেই
নিচের মত একটি নমুনা জেমফাইলে,
# Gemfile
gem 'httparty'
# irb
require 'rest-client'
# raises
LoadError (cannot load such file -- rest-client)
এটা নিশ্চিত করে যে শুধুমাত্র আমাদের Gemfile
-এ নির্দিষ্ট নির্ভরতা আমাদের প্রকল্পের প্রয়োজন হতে পারে৷
বান্ডেল exec
আপনি যখন rspec
চালান একটি প্রজেক্ট ডিরেক্টরিতে, Gemfile
-এ যা উল্লেখ করা হয়েছে তা ছাড়া অন্য সংস্করণ চালানোর সম্ভাবনা রয়েছে . কারণ Gemfile
-এ উল্লিখিত সংস্করণের বিপরীতে সবচেয়ে সাম্প্রতিক সংস্করণটি চালানোর জন্য নির্বাচন করা হবে। . bundle exec rspec
rspec
নিশ্চিত করে সেই প্রকল্পের পরিপ্রেক্ষিতে চালিত হয় (অর্থাৎ, জেমফাইলে নির্দিষ্ট রত্ন)।
বান্ডেল binstubs
৷
প্রায়শই, আমরা নিবন্ধগুলি পড়ি যেখানে আমরা ./bin/rails
এর মতো কমান্ড চালাই; এই কমান্ডটি bundle exec rails
এর মত . bundle exec
এর ব্যবহার সহজ করার জন্য Binstubs হল রুবি এক্সিকিউটেবলের চারপাশে মোড়ানো। .
একটি binstub রান তৈরি করতে, bundle binstubs gem-name
ব্যবহার করুন . এটি ./bin
-এ একটি binstub তৈরি করে ফোল্ডার কিন্তু --path
দিয়ে কনফিগার করা যেতে পারে ডিরেক্টরি সেট করা হলে।
রেফারেন্স
আরও জানতে, এই রেফারেন্সগুলি দেখুন:
- কীভাবে রত্ন কাজ করে?
- Rbenv
- RubyGems
- বান্ডলার