40

我需要ERB(Ruby 的模板系统)来模板化非 HTML 文件。
(相反,我想将它用于源文件,例如 .java、.cs、...)

如何从命令行“执行” Ruby 模板?

4

6 回答 6

25

您应该在 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讨论(从页面的一半开始)。

另请注意,Jack Herrington 写了一本关于使用 Ruby/ERB 的代码生成的整本书。

于 2009-06-11T11:41:01.913 回答
24

编写一个 ruby​​ 脚本来完成它。API 文档在这里: http ://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/

例如:

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

(其中 binding 是与模板所需的 @vars 的绑定。)

于 2009-06-11T14:32:58.337 回答
15

另一种选择是使用 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变量的顶层作为绑定。

于 2009-06-12T18:11:24.010 回答
12

如果您可以将 ERB 切换到 Erubis,那么您的问题解决就很简单:

require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
于 2010-06-11T10:10:58.263 回答
7

在尝试测试我的 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(或其他工具)将其与预渲染输出进行比较。

于 2016-12-06T15:42:29.407 回答
-1

我试图对此发表评论,但评论链接不可用。

我正在使用这个:

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)
于 2009-11-11T13:29:10.910 回答