Использование File::read в default.rb провайдера в Chef

Я пытаюсь создать 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 для него.

Я продолжаю получать ошибку следующим образом:

LoadError

не могу загрузить такой файл -:: File

Кто-нибудь знает, как я могу использовать File:: read внутри моего провайдера LWRP?

3 ответа

Решение

Это происходит потому, что у 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

Итак, два предыдущих ответа наполовину верны. У тебя две проблемы. Во-первых, вы не можете требовать ::File поскольку это уже часть Ruby. Это причина вашей ошибки.

Во-вторых, если вы позвоните File.read вы схватите шеф-повара File не рубин. Вам нужно сделать ::File.read использовать класс File Ruby.

require '::File'

Неверно и вызывает ошибку LoadError. Удалить эту строку. Тебе это не нужно. File является частью ядра Ruby и не должен быть requireд.

Для дальнейшего объяснения, строковый аргумент require представляет имя файла библиотеки, которую вы хотите загрузить. Итак, это должно выглядеть require "file", или же require "rack/utils",

Другие вопросы по тегам