Я создал LWRP, используя chefdk и следуя документации и нескольким сообщениям в блоге.Требуется ли attr_accessor в определении ресурсов шеф-повара lwrp?
ресурс
actions :install
default_action :install
provides :foo
attribute :name, :kind_of => String, :name_attribute => true
поставщик
provides :foo
def whyrun_supported?
true
end
use_inline_resources
action :install do
converge_by("install: #{@new_resource}") do
execute "installation of: #{@new_resource.name}" do
command "foo install #{@new_resource.name}"
end
end
end
def load_current_resource
@current_resource = Chef::Resource::Foo.new @new_resource.name
@current_resource.name = @new_resource.name
end
При использовании этого LWRP в кулинарной книге, я хотел бы получить следующую ошибку:
undefined method `name=' for Chef::Resource::Foo
Единственный путь я может исправить i t было добавлено attr_accessor :name
к определению ресурса. Но я никогда не видел это как требование в любой документации. Из документации я предполагал, что Шеф позаботился о настройке attr_accessor
по любым атрибутам во время компиляции ресурсов/поставщиков. Может ли кто-нибудь подтвердить, что я нашел или объяснить, что на самом деле происходит?
Спасибо.
Я использовал http://dougireton.com/blog/2013/01/07/creating-an-lwrp-part-2/ в качестве руководства. Это сообщение в блоге показывает настройку «имя» с помощью метода «имя», а также другие атрибуты, заданные одинаково. Я просто предположил, что = будет работать. Этот шеф-повар использует метод method_missing для создания методов для attrs? Или это Ruby say = будет работать только с использованием «attr_accessor»? – glevine
Извините, я могу только ответить за то, что знаю от шеф-повара, я не эксперт по рубину, но насколько я понял, атрибуты задаются с помощью методов (с подзаголовкой метода с именем set_or_return), чтобы позволить им использовать их в обоих направлениях (доступ и назначение). Вы можете посмотреть [код шеф-повара на github] (https://github.com/chef/chef/blob/master/lib/chef/resource/lwrp_base.rb#L75), если вы заинтересованные в шеф-поварах. – Tensibai
После прочтения кода и выполнения нескольких тестов я могу подтвердить, что шеф-менеджер динамически создает сеттер/получатель для каждого атрибута, и эти методы следует вызывать для установки значений атрибутов в 'load_current_resource'. Я не уверен, что это говорит о том, что Chef считает идиоматическим кодом, но они не предписывают использовать читателей и писателей для атрибутов. – glevine