#chef-infra #chef-recipe
#шеф-повар-инфра #шеф-рецепт
Вопрос:
У меня возникли некоторые проблемы с ‘chef ! = ruby’. У меня есть некоторый XML-код, который, кажется, отлично работает в irb
и pry
, но терпит неудачу в chef с помощью
NoMethodError
-------------
undefined method `add_attribute'
ошибка.
require "rexml/document"
::Chef::Recipe.send(:include, REXML) # can't `include REXML`
updates = Document.new(File.new updates_file)
options = updates.elements.each('application/component/option[@name="CHECK_NEEDED"]/@value') {|e| e}
unless options.empty?
# Set existing <option /> Element
element = options[0]
# element.add_attribute("value", "false")
# element.add_attribute( Attribute.new("value", "false") )
# element.send("add_attribute", "value", "false")
element.send("add_attribute", Attribute.new("value", "false"))
Как я могу заставить этот рецепт «скомпилироваться»?
Комментарии:
1. Есть ли какая-то конкретная причина, по которой вы хотите использовать этот код в рецепте вместо библиотеки? Кроме того, вы можете сослаться:- blog.chef.io/2013/09/04 /…
2. Итак, вы объединяете пространства имен с вероятным конфликтом имен методов, почему бы просто не использовать REXML::<метод> ? (и избегая вызова Recipe.send)
3. Ох, вздох. Проблема была на самом деле в
updates.elements.each('application/component/option[@name="CHECK_NEEDED"]/@value') {|e| e}
, который возвращал REXML::атрибут, а не REXML::элемент, который его содержит.