Использование 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"
,