如何从命令行执行没有Web服务器的ruby模板文件(ERB)?

我需要ERB (Ruby的模板系统)模板非HTML文件。
(而是,我想使用它的源文件,如.java,.cs,…)

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

你应该在你的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编书讨论(从页面中途开始)。

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

写一个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绑定的。)

另一个select是使用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”,使用顶层,你定义hellovariables作为绑定。

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

 require 'erubis' template = File.read("sample_file.erb") template = Erubis::Eruby.new(template) template.result(:your_variable => "sample") 

试图testing我的Puppet模板时发现这个问题。

结束这个解决scheme:

  1. 沿着你的foo.erb创build一个文件foo.vars.erb
  2. 把所有的模板variables放到这个新文件中,例如:

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

    或同等学历):

     <% @my_param="foo bar" @another_param=123 %> 
  3. 在命令行上运行这个:

     cat foo.vars.erb foo.erb | erb 

现在您的完全呈现的模板应该打印到标准输出。 从那里你手动检查输出,或者你可以把差异(或其他工具)与预渲染的输出进行比较。

我试图评论这个,但评论链接不可用。

我正在使用这个:

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

从上面的post:我发现我认为这可能是一个问题:

我正在创buildDOS 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)