Chef infra Bershelf和安装更新的食谱

Chef infra Bershelf和安装更新的食谱,chef-infra,Chef Infra,我已经分叉了巧克力食谱,试图添加设置您希望与哪个用户一起执行安装脚本的功能 因此,我添加到参考资料/default.rb: attribute :user, :kind_of => String @current_resource.user = (@new_resource.user) 我在providers/default.rb中添加了: attribute :user, :kind_of => String @current_resource.user = (@new_re

我已经分叉了巧克力食谱,试图添加设置您希望与哪个用户一起执行安装脚本的功能

因此,我添加到
参考资料/default.rb

attribute :user, :kind_of => String
@current_resource.user = (@new_resource.user)
我在
providers/default.rb
中添加了:

attribute :user, :kind_of => String
@current_resource.user = (@new_resource.user)
加载当前资源,这样我就可以

user @current_resource.user  if @current_resource.user 
在它用于实际安装包的执行块中

我原以为这会管用,但我得到的只是Chef::Resource::Chocolate`的
未定义的方法user=

那么,我做错了什么?我已经看过了,但是我找不到任何关于资源属性如何在提供者中声明和使用的明确信息,我有点困惑

编辑:我将
:user
添加到资源文件中的
attr\u访问器
,但这只是给出了一个不同的错误:
参数数量错误(1代表0)

编辑: 好的,我不知道为什么,但是由于某种原因,
@current\u resource
没有从
加载当前\u resource
函数返回;当我能够让vagrant做一个完整的堆栈跟踪,并意识到我在执行块上为巧克力供应商的安装操作设置用户时出错,我就解决了这个问题

我所做的只是通过确保最后一行是
@current\u resource
来确保它被返回。现在它工作了,我的意思是肯定它出错了,但原因完全不同

好的,这并没有解决它,我突然得到了未定义的方法'user',再次出现了nil:NilClass错误

编辑:

在登录之后,我发现
@current\u resource.user
在我登录
load\u current\u resource
时不是
nil
,但我认为它在到达运行chocolaty安装包的执行脚本之前出错

提供者类是如何构建的?
@current_resource
是否仅存在于某些实例中

编辑:

好的,为了看看会发生什么,我将
@current\u resource.user
更改为
@current\u resource.instance\u variable\u get(:@user)
,结果成功了,没有为nil:NilClass定义未定义的方法“user”。发生什么事了?
为什么
@current\u resource.instance\u variable\u get(:@user)
起作用,但
@current\u resource.user
不起作用?

所以Chef的资源属性不像Ruby的访问器那样起作用(而且你不应该混合使用它们)。在提供程序中进行设置的方法是
@current\u resource.user(@new\u resource.user)
。这是因为属性方法为在配方DSL块中使用而进行了真正的优化(在配方DSL块中,您将有类似于
user'foo'
)。

好的,所以我将其更改为
@current\u resource.user(@new\u resource.user)
就像你建议的那样,但现在我得到了nil:NilClass的
未定义的方法“user”。你是否正在创建
当前的\u资源
?我也是,我认为我的问题类似于这个问题: