我需要ERB(Ruby 的模板系统)来模板化非 HTML 文件。
(相反,我想将它用于源文件,例如 .java、.cs、...)
如何从命令行“执行” Ruby 模板?
我需要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 prog book讨论(从页面的一半开始)。
另请注意,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)
(其中 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")
在尝试测试我的 Puppet 模板时发现了这个问题。
以这个解决方案结束:
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
您的完全渲染的模板现在应该打印到标准输出。从那里您可以手动检查输出,或者您可以使用 diff(或其他工具)将其与预渲染输出进行比较。
我试图对此发表评论,但评论链接不可用。
我正在使用这个:
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)