在 Chef 的供应商 default.rb 中使用 File::read
Using File::read in a provider's default.rb in Chef
我正在尝试创建一个 LWRP,它将调用在其自身中定义的资源。我的食谱结构如下:
在 machine cookbook 的 provider 中,我有一个代码片段如下:
require 'chef/provisioning' # driver for creating machines
require '::File'
def get_environment_json
@@environment_template = JSON.parse(File::read(new_resource.template_path + "environment.json"))
return @@environment_template
end
该代码仅尝试读取 json 文件,我正在使用 File::read。
我不断收到如下错误:
加载错误
无法加载此类文件 -- ::File
有人知道如何在我的 LWRP 提供程序中使用 File::read 吗?
require '::File'
不正确并导致 LoadError。删除此行。你不需要它。 File
是 Ruby 核心的一部分,不需要 require
d。
进一步说明,require
的字符串参数表示要加载的库的文件名。所以,它应该看起来像 require "file"
,或 require "rack/utils"
。
发生这种情况是因为 Chef 已经有一个文件资源。我们必须在 recipe.We 中使用 Ruby 文件 class 使用 ::File 来使用 Ruby 文件 class 来解决这个问题。例如:
execute 'apt-get-update' do
command 'apt-get update'
ignore_failure true
only_if { apt_installed? }
not_if { ::File.exist?('/var/lib/apt/periodic/update-success-stamp') }
end
好的,前面两个答案都对了一半。你有两个问题。
首先,您不能要求 ::File
,因为它已经是 Ruby 的一部分。这是你错误的原因。
其次,如果您调用 File.read
,您将获得 Chef 的 File
而不是 ruby 的。您需要执行 ::File.read
才能使用 Ruby 的文件 class。
我正在尝试创建一个 LWRP,它将调用在其自身中定义的资源。我的食谱结构如下:
在 machine cookbook 的 provider 中,我有一个代码片段如下:
require 'chef/provisioning' # driver for creating machines
require '::File'
def get_environment_json
@@environment_template = JSON.parse(File::read(new_resource.template_path + "environment.json"))
return @@environment_template
end
该代码仅尝试读取 json 文件,我正在使用 File::read。
我不断收到如下错误:
加载错误
无法加载此类文件 -- ::File
有人知道如何在我的 LWRP 提供程序中使用 File::read 吗?
require '::File'
不正确并导致 LoadError。删除此行。你不需要它。 File
是 Ruby 核心的一部分,不需要 require
d。
进一步说明,require
的字符串参数表示要加载的库的文件名。所以,它应该看起来像 require "file"
,或 require "rack/utils"
。
发生这种情况是因为 Chef 已经有一个文件资源。我们必须在 recipe.We 中使用 Ruby 文件 class 使用 ::File 来使用 Ruby 文件 class 来解决这个问题。例如:
execute 'apt-get-update' do
command 'apt-get update'
ignore_failure true
only_if { apt_installed? }
not_if { ::File.exist?('/var/lib/apt/periodic/update-success-stamp') }
end
好的,前面两个答案都对了一半。你有两个问题。
首先,您不能要求 ::File
,因为它已经是 Ruby 的一部分。这是你错误的原因。
其次,如果您调用 File.read
,您将获得 Chef 的 File
而不是 ruby 的。您需要执行 ::File.read
才能使用 Ruby 的文件 class。