使用eruby还是erb?

时间:2020-03-05 18:56:36  来源:igfitidea点击:

eruby和erb有什么区别?有哪些考虑因素会促使我选择其中一个?

我的应用程序正在为网络设备(路由器,负载平衡器,防火墙等)生成配置文件。我的计划是使用源文件中的嵌入式ruby(通过eruby或者erb)对配置文件进行模板化,以进行迭代生成路由器的所有接口配置块(这些块非常相似,仅在标签上有所不同)之类的操作。和IP地址)。例如,我可能有一个这样的配置模板文件:

hostname sample-router
<%=
r = String.new;
[
    ["GigabitEthernet1/1", "10.5.16.1"],
    ["GigabitEthernet1/2", "10.5.17.1"],
    ["GigabitEthernet1/3", "10.5.18.1"]
].each { |tuple|
    r << "interface #{tuple[0]}\n"
    r << "    ip address #{tuple[1]} netmask 255.255.255.0\n"
}
r.chomp
%>
logging 10.5.16.26

通过嵌入式红宝石解释器(erb或者eruby)运行时,将产生以下输出:

hostname sample-router
interface GigabitEthernet1/1
    ip address 10.5.16.1 netmask 255.255.255.0
interface GigabitEthernet1/2
    ip address 10.5.17.1 netmask 255.255.255.0
interface GigabitEthernet1/3
    ip address 10.5.18.1 netmask 255.255.255.0
logging 10.5.16.26

解决方案

回答

没关系,它们都是一样的。 erb是纯红宝石,eruby是用C编写的,因此速度要快一些。

erubis(第三个)是纯红宝石,并且比上面列出的两个都快。但我怀疑这种速度是否会成为瓶颈,因此只需使用erb。它是Ruby标准库的一部分。

回答

Eruby是一个外部可执行文件,而erb是Ruby中的一个库。如果要独立处理模板文件(例如,快速替换PHP),则使用前者;如果需要在其他Ruby脚本的上下文中处理它们,则可以使用后者。使用ERB仅仅是因为它更灵活,所以更常见,但是我承认我一直迷恋于eruby来为快速的小实用程序网站执行.rhtml文件。

回答

我正在使用erb做类似的事情,性能对我来说很好。

正如Jordi所说,如果我们实际上要使用列出的模板,那么这取决于我们要在哪个上下文中运行,eruby可能会更好地工作,但是我想我们实际上将要传递变量模板,在这种情况下,我们需要erb。

仅供参考,使用erb时,我们需要向其传递要从中获取变量的对象的绑定,如下所示:

device = Device.new
device.add_interface("GigabitEthernet1/1", "10.5.16.1")
device.add_interface("GigabitEthernet1/2", "10.5.17.1")

template = File.read("/path/to/your/template.erb")
config = ERB.new(template).result(device.binding)