Требуется ли attr_accessor в определении ресурса шеф-повара lwrp?

Я создал LWRP с помощью chefdk, строго следуя документации и нескольким сообщениям в блоге.

ресурс

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

Единственный способ исправить это — добавить attr_accessor :name к определению ресурса. Но я никогда не рассматривал это как требование в какой-либо документации. Из документации я предположил, что Chef позаботился о настройке attr_accessor для любых атрибутов во время компиляции ресурса/поставщика. Может ли кто-нибудь подтвердить то, что я нашел, или объяснить, что на самом деле происходит?

Спасибо.


person glevine    schedule 24.04.2015    source источник


Ответы (1)


def load_current_resource
  @current_resource = Chef::Resource::Foo.new @new_resource.name
  @current_resource.name = @new_resource.name
end

Ваша проблема здесь, name должен быть неизменным (для соответствия текущего и нового ресурса), поскольку он идентифицирует ресурс, вам не следует пытаться установить @current_resource.name.

Удалите эту строку, и все должно быть в порядке без аксессора.

person Tensibai    schedule 24.04.2015
comment
Я использовал dougireton.com/blog/2013/01. /07/creating-an-lwrp-part-2 в качестве руководства. В этом сообщении в блоге показано, как установить «имя» с помощью метода «имя», а также другие атрибуты, установленные таким же образом. Я просто предположил, что = тоже будет работать. Использует ли этот шеф-повар метод «method_missing» для создания методов для атрибутов? Или Руби говорит, что = будет работать только с использованием «attr_accessor»? - person glevine; 24.04.2015
comment
Извините, я могу ответить только за то, что знаю от шеф-повара, я не эксперт по рубинам, но, насколько я понял, атрибуты устанавливаются с помощью методов (с подвызовом метода с именем set_or_return), чтобы разрешить их использование в обоих направлениях (доступ и назначение) Вы можете взглянуть на код шеф-повара на github, если вам интересны внутренности шеф-повара. - person Tensibai; 24.04.2015
comment
Прочитав код и выполнив несколько тестов, я могу подтвердить, что Chef динамически создает метод установки/получения для каждого атрибута, и эти методы следует вызывать для установки значений атрибутов в load_current_resource. Я не уверен, говорит ли это что-нибудь о том, что Chef считает идиоматическим кодом, но они не предписывают использование чтения и записи для атрибутов. - person glevine; 24.04.2015
comment
@glevine рад, что это помогло, есть канал #chef на irc.freeware.net, а также список рассылки, где разработчики шеф-поваров отвечают и говорят, если вы хотите покопаться в теме (см. тег wiki для ссылок) - person Tensibai; 24.04.2015
comment
irc в предыдущем комментарии — irc.freenode.net :/ - person Tensibai; 27.04.2015