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

标签 ruby erb

我编写了一个 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] %>

生成.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(", ") %>]

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

关于ruby - 如何避免使用 erb 模板中的引号生成内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62921058/

相关文章:

ruby - 将 ruby​​ 数组用于 erb 中的 javascript 数组。转义引号

javascript - 为什么我的 js.erb 文件中没有工作链接

html - 如何只显示特定路径中的特定导航栏元素(ruby 逻辑)

ruby - 在 Ruby 中反向 DNS?

ruby - 将字符串转换为关键字

ruby-on-rails - 从 Bash -> Docker 按名称 -> Ruby -> 清除缓存

ruby-on-rails - Chef cloudera Recipe 找不到丢失的依赖项

ruby - Windows 7 上的辣椒项目

javascript - HTML Javascript <%= %> 标签

ruby-on-rails - 模块构建失败 : Error: spawn bin/rails ENOENT