5

我正在尝试创建一个 LWRP,它将调用在其内部定义的资源。我的食谱的结构如下:

在此处输入图像描述

在机器说明书的提供者中,我有一个代码片段如下:

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 ?

4

3 回答 3

6

好的,所以前两个答案都对了一半。你有两个问题。首先,您不能要求::File,因为它已经是 Ruby 的一部分。这是你的错误的原因。

其次,如果你打电话,File.read你会抢到 Chef'sFile而不是 ruby​​'s。你需要做一个::File.read使用 Ruby 的 File 类。

于 2015-05-01T13:29:21.677 回答
0
require '::File'

不正确并导致 LoadError。删除这一行。你不需要它。File是 Ruby 核心的一部分,不需要是required.

为了进一步解释,字符串参数require表示您要加载的库的文件名。所以,它应该看起来像require "file", 或require "rack/utils"

于 2015-04-30T17:57:45.990 回答
0

发生这种情况是因为 Chef 已经拥有文件资源。我们必须在配方中使用 Ruby File 类。我们使用 ::File 来使用 Ruby File 类来解决这个问题。例如:

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

来源:https ://docs.chef.io/ruby.html#ruby-class

于 2015-04-30T21:16:09.660 回答