Как запустить файлы шаблонов ruby ​​(ERB) без веб-сервера из командной строки? - PullRequest
37 голосов
/ 11 июня 2009

Мне нужно ERB (система шаблонов Руби) для шаблонирования не-HTML файлов.
(Вместо этого я хочу использовать его для исходных файлов, таких как .java, .cs, ...)

Как мне "выполнить" шаблоны Ruby из командной строки?

Ответы [ 7 ]

25 голосов
/ 11 июня 2009

Вы должны иметь все необходимое в каталоге ruby ​​/ bin. На моей (WinXP, Ruby 1.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.

(РЕДАКТИРОВАТЬ: в Windows есть erb.bat и просто "erb". Файл .bat - это просто оболочка для erb, которая, как я полагаю, должна заставить ту же команду работать практически одинаково в любой ОС)

См. Обсуждение prag prog book (начинается примерно на полпути вниз по странице).

Обратите внимание, что Джек Херрингтон написал целую книгу о генерации кода, использующего Ruby / ERB.

23 голосов
/ 11 июня 2009

Напишите скрипт ruby, который это делает. Документация по API находится здесь: http://www.ruby -doc.org / STDLIB / libdoc / ERB / ​​RDoc /

Например:

template = ERB.new File.read("path/to/template.erb"), nil, "%"
template.result(binding)

(Где связывание - это привязка с @vars, которая нужна шаблону.)

14 голосов
/ 12 июня 2009

Другой вариант - использовать ruby ​​-e, так как ERB его прост:

Что-то вроде:

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 как привязку.

12 голосов
/ 11 июня 2010

Если вы можете переключить ERB на Erubis, решение вашей проблемы так же просто, как:

require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
4 голосов
/ 06 декабря 2016

Нашел этот вопрос при попытке протестировать мои шаблоны Puppet.

Закончено этим решением:

  1. Вдоль вашего foo.erb создайте файл foo.vars.erb
  2. Поместите все переменные шаблона в этот новый файл, например ::

    <% @my_param="foo bar" %>
    <% @another_param=123 %>
    

    или (эквивалент):

    <%
    @my_param="foo bar"
    @another_param=123
    %>
    
  3. В командной строке запустите:

    cat foo.vars.erb foo.erb | erb
    

Ваш полностью обработанный шаблон теперь должен быть распечатан на стандартный вывод. Оттуда вы проверяете вывод вручную или можете использовать diff (или другие инструменты), чтобы сравнить его с предварительно обработанным выводом.

1 голос
/ 26 августа 2011

Это хорошая базовая статья - http://rrn.dk/rubys-erb-templating-system И еще один - http://www.stuartellis.eu/articles/erb/

0 голосов
/ 11 ноября 2009

Я пытался это прокомментировать, но ссылка для комментариев недоступна.

Я использую это:

template = ERB.new File.new("path/to/template.erb").read, nil, "%"
template.result(binding)

Из публикации выше: и я нашел то, что, как мне кажется, может быть проблемой:

Я создаю файлы DOS BATCH, например:

%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)
...