【问题标题】:blocks don't see methods (chef resources)块看不到方法(厨师资源)
【发布时间】:2012-05-21 10:38:19
【问题描述】:

假设我们有两个资源:

template 'template1' do
  owner 'root'
  group 'root'
end

template 'template2' do
  owner 'root'
  group 'root'
end

我想在资源中重用代码。但是,如果我在配方中定义了一个 proc,你会得到 ownergroup 等的 NoMethodError。为什么会发生这种情况?词法范围没有什么不同,是吗?结果我必须使用self.instance_eval &common_cfg

common_cfg = Proc.new {
  owner 'root'
  group 'root'
}

template 'template1' do
  common_cfg.call
end

template 'template2' do
  common_cfg.call
end

【问题讨论】:

  • 设为全局($common_cfg)是否会出现错误?
  • proc 变量的评估结果很好,因为 NoMethodError 发生在 proc 的上下文中(所有者、组等)
  • 哦; gotcha--将删除评论。
  • 您的 proc 会记住在定义 proc 时 self 的值,即顶级对象。似乎厨师使用 instance_eval 执行块,因此块内的 self 与您的 proc 中的 self 不同
  • 这可能正是正在发生的事情。如果没有其他人可以分享,我会将此作为答案。我还在思考为什么 instance_eval 在 Ruby 中很重要:rubylearning.com/blog/2010/11/30/…

标签: ruby closures code-reuse chef-infra lexical-scope


【解决方案1】:

由于 chef 的实现方式(有很多反射),您需要将其放入库或 ruby​​ 块资源中以保护它。我认为红宝石块资源会起作用,因为它超出了范围。

http://wiki.opscode.com/display/chef/Libraries

通常因为这个原因成语是

["file_one","file_two"].each do |file|
  template file do
    owner "root"
    group "root"
  end
end

【讨论】:

  • 第二个链接坏了。
  • @Eye 已删除,因为它不再相关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2014-03-06
  • 2014-05-28
相关资源
最近更新 更多