如何避免使用 erb 模板中的引号生成内容?
How to avoid generating content with quotes from an erb template?
我写了一个 erb 模板,我用它来动态生成 Dockerfile。整个过程是这样的:
- 从命令行获取输入。
- 根据输入创建一个 ruby 数组。
- 使用 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(", ") %>]
并不是说这是错误的方法,但这并不是一个典型的做法,所以我认为没有另一种内置方法可以做到这一点。
我写了一个 erb 模板,我用它来动态生成 Dockerfile。整个过程是这样的:
- 从命令行获取输入。
- 根据输入创建一个 ruby 数组。
- 使用 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(", ") %>]
并不是说这是错误的方法,但这并不是一个典型的做法,所以我认为没有另一种内置方法可以做到这一点。