كيف يمكنني تنفيذ ملفات قالب Ruby (ERB) بدون خادم ويب من سطر الأوامر؟
-
13-09-2019 - |
سؤال
احتاج عرب (نظام قالب روبي) لإصدار ملفات غير HTML.
(بدلا من ذلك، أريد استخدامه لملفات المصدر مثل .java، .cs، ...)
كيف أفعل "ينفذ" قوالب روبي من سطر الأوامر؟
المحلول
يجب أن يكون لديك كل ما تحتاجه في دليل Ruby / Bin الخاص بك. في نظام My (WinXP، Ruby 1.8.8.6)، لدي ruby/bin/erb.bat
erb.bat [switches] [inputfile]
-x print ruby script
-n print ruby script with line number
-v enable verbose mode
-d set $DEBUG to true
-r [library] load a library
-K [kcode] specify KANJI code-set
-S [safe_level] set $SAFE (0..4)
-T [trim_mode] specify trim_mode (0..2, -)
-P ignore lines which start with "%"
لذا erb your_erb_file.erb
يجب أن تكتب النتيجة إلى Stdout.
(عدل
انظر PRAG Prog Book. مناقشة (تبدأ في منتصف الطريق أسفل الصفحة).
لاحظ أيضا أن جاك هيرينغتون كتب كتاب كامل حول رمز التوليد الذي يستخدم Ruby / Erb.
نصائح أخرى
اكتب سيناريو روبي يفعل ذلك. وثائق API هنا:http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/
علي سبيل المثال:
template = ERB.new File.read("path/to/template.erb"), nil, "%"
template.result(binding)
(حيث التوصيل هو ملزم معvars التي يحتاجها القالب.)
سيكون هناك خيار آخر هو استخدام Ruby -e، لأن Erb Itslef بسيط للغاية.
شيء مثل:
ruby -rerb -e "puts ERB.new(File.read(<file name here>)).result"
ومع ذلك، أفترض أن لديك سياق تريد تقديم القالب فيه. كيف تتوقع الحصول على هذا السياق؟ على سبيل المثال، تحقق من:
ruby -rerb -e "hello = 'hello'; puts ERB.new('<%= hello %> world').result(binding)"
والتي ستطبع "Hello World"، باستخدام المستوى الأعلى، حيث حددت hello
متغير، كما التجليد.
إذا كنت تستطيع تبديل ERB إلى Erubis، فإن حل المشكلات الخاصة بك بسيطة مثل:
require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
وجدت هذا السؤال أثناء محاولة اختبار قوالب الدمية الخاصة بي.
انتهى بهذا الحل:
- على طول الخاص بك
foo.erb
إنشاء ملفfoo.vars.erb
ضع جميع متغيرات القالب في هذا الملف الجديد، على سبيل المثال:
<% @my_param="foo bar" %> <% @another_param=123 %>
أو ما يعادلها):
<% @my_param="foo bar" @another_param=123 %>
عند تشغيل سطر الأوامر هذا:
cat foo.vars.erb foo.erb | erb
يجب الآن طباعة القالب الذي تم تقديمه بالكامل إلى STD-OUT. من هناك، يمكنك التحقق من الإخراج باليد، أو يمكنك أن تأخذ Diff (أو أدوات أخرى) لمقارنتها بمخرج مسبق.
هذه مقالة أساسية جيدة - http://rrn.dk/rubys-erb-stem-System.و واحدة اخرى - http://www.stuartellis.eu/articles/erb/
حاولت التعليق على هذا، ولكن رابط التعليقات غير متوفرة.
أنا أستخدم هذا:
template = ERB.new File.new("path/to/template.erb").read, nil, "%"
template.result(binding)
من النشر أعلاه: ووجدت ما أعتقد أنه قد يكون مشكلة:
أقوم بإنشاء ملفات دفعة DOS مثل:
%JAVA_HOME%\bin\jar -xvf <%=inputfile%>...
ووجدت مشكلة شيء غريب - أحصل على هذا عندما أركض مع الرمز أعلاه:
Processing Template test.txt
erb):2:in `render': compile error (SyntaxError)
erb):2: syntax error, unexpected tSTRING_BEG, expecting $end
erbout.concat "\n"
^
from DBUser.rb:49:in `render'
from DBUser.rb:43:in `each'
from DBUser.rb:43:in `render'
from DBUser.rb:81
جربت ما يلي، وحصلت على مشكلتي الخاصة - لست متأكدا مما إذا كانت هذه هي الإجابة الصحيحة للجميع ...
template = ERB.new File.new("path/to/template.erb").read
template.result(binding)