在Windows上使用Chef创建UTF-8编码文件

时间:2017-04-08 14:10:27

标签: ruby windows character-encoding chef

我正在使用Chef在Windows 12上创建一个UDL文件。该文件必须编码为UTF-8,但我无法让Chef生成除ANSI以外的任何内容。

在工作站上,模板文件是UTF-8编码的,但是当它落在厨师缓存中时,目标节点上结束的模板文件是ANSI - 因此在文件传输期间编码似乎丢失了到目标节点。在Chef-client运行期间,目标节点的ruby默认为UTF-8,虽然我希望因为源ERB模板是ANSI,所以目标也被创建为ANSI。

配方很简单:

log "Encoding is #{Encoding.default_external}"

template 'C:/file.udl' do
  rights :full_control, 'Everyone'
  action :create
  source 'file.udl.erb'
end

模板(UTF-8在源处编码但未在传输到目标节点后):

[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=True;User ID=MyUsername;Initial Catalog=MyCat;Data Source=MyServer

无法通过OLE读取生成的ANSI文件...无论如何要说服Chef / ruby​​以UTF-8编写文件?

1 个答案:

答案 0 :(得分:0)

这是我的方法,入侵Chef :: Mixin :: Template :: TemplateContext

libraries/template_hacking.rb

require 'chef/mixin/template'

# Hacking Chef loads template with specific encoding
# Usage in your recipe:
#
#   template 'my_utf8_file' do
#     source 'my_utf8_file'
#     variables(
#       __encoding__: 'utf-8',
#       name: '你好'
#     )
#   end
#
unless Chef::Mixin::Template::TemplateContext.public_methods.include?(:_origin_render_template)
  class Chef::Mixin::Template::TemplateContext
    alias_method :_origin_render_template, :_render_template
    def _render_template(template, context)
      encoding = context[:__encoding__] && context[:__encoding__].upcase
      if template && encoding && template.encoding.name != encoding
        Chef::Log.info("Encoding template to #{encoding}")
        template.force_encoding encoding
      end
      _origin_render_template(template, context)
    end
  end
end

在配方recipes/my_recipe.rb

template 'my_utf8_file' do
  source 'my_utf8_file'
  variables(
    __encoding__: 'utf-8',
    name: '你好'
  )
end