Как я выполняю рубиновые шаблонные файлы (ERB) без веб-сервера из командной строки?

«Файл заголовка» фактически вставляется препроцессором перед началом компиляции. Просто думайте об этом как о «замене» его директивы #include.

Страж ...

#ifndef MY_HEADER_H
#define MY_HEADER_H

....

#endif

... выполняется после замены. Таким образом, заголовок может фактически быть включен несколько раз, но «защищенная» часть текста передается компилятору только один раз препроцессором.

Итак, если в заголовке есть какие-либо определения генерации кода, они, разумеется, будут включены в объектный файл модуля компиляции (он же «модуль»). Если один и тот же заголовок имеет значение #include в нескольких модулях, они появятся несколько раз.

Для определений static это совсем не проблема, так как они не будут видны за пределами модуля (он же область действия файла ). Для глобальных программных определений это отличается и приведет к ошибке «множественные определения».

Примечание: это в основном для C . Для C ++ есть существенные различия, поскольку классы и т. Д. Добавляют дополнительную сложность тому, что / когда допускается несколько глобальных объектов.

37
задан ivan_ivanovich_ivanoff 11 June 2009 в 23:52
поделиться

5 ответов

У вас должно быть все необходимое в каталоге 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.

(EDIT : windows имеет erb.bat и просто "erb". Файл .bat - это просто оболочка для erb, которая, как я полагаю, должна заставить ту же команду работать практически одинаково в любой ОС)

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

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

25
ответ дан 27 November 2019 в 04:28
поделиться

Write a ruby script that does it. The API documentation is here: http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/

Например:

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

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

24
ответ дан 27 November 2019 в 04:28
поделиться

Другой вариант - использовать 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 в качестве привязки.

14
ответ дан 27 November 2019 в 04:28
поделиться

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

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

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)
0
ответ дан 27 November 2019 в 04:28
поделиться

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

require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
13
ответ дан 27 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: