هل مفاتيح سطر أوامر روبي -rubygems & -r غير متوافقة؟
سؤال
لقد قمت مؤخرًا بتحويل مكتبة روبي إلى جوهرة، الأمر الذي يبدو أنه يعطل سهولة استخدام سطر الأوامر
عملت بشكل جيد كمكتبة
$ ruby -r foobar -e 'p FooBar.question' # => "answer"
وباعتباره جوهرة، يعرف irb كيفية طلب الجوهرة من محولات سطر الأوامر
$ irb -rubygems -r foobar
irb(main):001:0> FooBar.question # => "answer"
لكن نفس الشيء يفشل بالنسبة لروبي نفسها:
$ ruby -rubygems -r foobar -e 'p FooBar.question'
ruby: no such file to load -- foobar (LoadError)
هل يجب أن أفعل هذا الآن، والذي يبدو قبيحًا:
ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer"
أم أن هناك طريقة لجعل المفتاحين يعملان؟
ملحوظة:أعلم أن الجوهرة يمكنها إضافة حاوية/برنامج لكل طريقة مفيدة ولكني لا أرغب في تلويث مساحة اسم سطر الأوامر دون داع
المحلول
-rubygems هو في الواقع نفس -r ubygems.
إنه لا يعبث بمسار البحث الخاص بك، على حد علمي، لكنني أعتقد أنه لا يضيف أي شيء إلى مسار البحث -r أيضًا.لقد تمكنت من القيام بشيء مثل هذا:
ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass"
MyHelpfulClass.rb موجود في دليل lib المحدد أعلاه.
هذا النوع من الأشياء سيئ، لكنه يوضح على الأقل أنه يمكنك الحصول على توجيهات متعددة تتطلب توجيهات.
كحل بديل أقل قبحًا، يمكنك إضافة عناصر إضافية إلى مسار البحث في مكتبة روبي (مفصول بنقطتين في *nix، ومفصول بفاصلة منقوطة في windows).
export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
إذا كنت لا تريد العبث بمتغير البيئة، فيمكنك إضافة شيء ما إلى مسار التحميل بنفسك:
ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \
-rubygems -r MyHelpfulClass -e "puts MyHelpfulClass"
نصائح أخرى
ملحوظة:هذه المشكلة موجودة في روبي 1.8، ولكن تم حلها في روبي 1.9.
في الإصدار 1.8، إذا قمت بتحديد كلا libs عبر -r
, ، ستحاول روبي تحميل كل مكتبة دون الانتباه إلى التغييرات في ملف $LOAD_PATH
.لكن أحجار الياقوت تتغير $LOAD_PATH
لذلك يمكن العثور على الأحجار الكريمة.
السبب الذي يعمل به irb
هل هذا irb
يفعل انتبه على $LOAD_PATH
التغييرات.
لسوء الحظ، أفضل حل وجدته هو استخدام النموذج الأكثر تفصيلاً:
ruby -rubygems -e 'require "foobar"; p FooBar.question'
لا يزداد الألم خطيًا مع عدد libs، إذا كنت تستخدم مكررًا:
ruby -rubygems -e '%w(rake rspec).each{|r| require r }'