如何避免使用 erb 模板中的引号生成内容?

How to avoid generating content with quotes from an erb template?

我写了一个 erb 模板,我用它来动态生成 Dockerfile。整个过程是这样的:

  1. 从命令行获取输入。
  2. 根据输入创建一个 ruby 数组。
  3. 使用 Dockerfile.erb 根据此输入生成 Dockerfile。

我在这里面临的问题是,当输入被复制到生成的 Dockerfile 时,它​​周围有引号,我需要避免。有办法吗?

Dockerfile.erb

FROM docker.cernerrepos.net/alpine:3.7 AS builder

LABEL bundles=<%= keys[:bundles] %>

generate.rb

require 'optparse'
require 'erb'

DEBUG_PREFIX = '>>> generate_dockerfile.rb ->'

@options = {}
@options[:output]= '.'

optparse = OptionParser.new do |opts|
  opts.banner = 'Usage: generate_dockerfile.rb [options]'
  opts.on('-b [BUNDLES]', '--bundles [BUNDLES]', "Comma separated list of bundles without extension and version.") do |bundles|
    @options[:bundles] = bundles.split(',')
  end
  opts.on('-h', '--help', 'Display this Help') do
    puts opts
    exit
  end
end

optparse.parse!

keys = @options

File.open('Dockerfile', 'w+') do |f|
  f.write(ERB.new(File.read('Dockerfile.erb'), nil, '-').result(binding))
end

实际输出 Dockerfile

FROM docker.cernerrepos.net/alpine:3.7 AS builder

LABEL bundles=["sample_bundle1", "sample_bundle2"]

预期输出 Dockerfile

FROM docker.cernerrepos.net/alpine:3.7 AS builder

LABEL bundles=[sample_bundle1, sample_bundle2]

要执行的命令

ruby generate.rb -b sample_bundle1,sample_bundle2

编辑 1:修改问题以包含最小示例代码、预期输出和实际输出以及 运行 代码的命令。

就在这里:

LABEL bundles=<%= keys[:bundles] %>

您基本上是在调用 keys[:bundle].to_s 并将其插入结果中。

什么是 ["foo", "bar"].to_s?是 ["foo", "bar"](带引号!)

这就是您得到这个结果的原因。

如果要去掉引号,可以改成下面这样:

LABEL bundles=[<%= keys[:bundles].join(", ") %>]

并不是说这是错误的方法,但这并不是一个典型的做法,所以我认为没有另一种内置方法可以做到这一点。