Bershelf并安装更新的食谱

时间:2014-11-05 15:18:26

标签: chef

我已经将chocolatey-cookbook分叉,试图添加设置您想要执行安装脚本的用户的功能。

所以,我添加到resources/default.rb

attribute :user, :kind_of => String

我添加到providers/default.rb

@current_resource.user = (@new_resource.user)

load_current_Resource函数,这样我就可以了

user @current_resource.user  if @current_resource.user 

在用于实际安装包的执行块中。

我认为这样可行,而我所得到的只是undefined method user=的Chef :: Resource :: Chocolatey`。

那么,我做错了什么?我看了,但我找不到任何关于如何在提供者中声明和使用资源属性的确定性,我有点难过。

编辑:我已将:user添加到资源文件中的attr_accessor,但这只是出现了不同的错误:wrong number of arguments (1 for 0)

编辑: 好的,我不知道为什么但由于某种原因@current_resource没有从load_current_resource函数返回;当我能够让流浪汉完成一个完整的堆栈跟踪并且意识到我在巧克力提供商的安装操作的执行块上设置用户时出错了。

我所做的就是确保最后一行是@current_resource,以确保返回。现在它起作用了,我的意思是肯定它有错,但是出于完全不同的原因。

好的,所以没有解决它,我突然再次出现undefined method 'user' for nil:NilClass错误。

编辑:

记录后,我发现@current_resource.usernil中登录时load_current_resource不是@current_resource但我认为它在执行脚本之前会出错,这将执行chocolaty安装包裹。

如何构建提供程序类? @current_resource.user仅在某些情况下存在吗?

编辑:

好的,只是为了看看会发生什么我将@current_resource.instance_variable_get(:@user)更改为undefined method 'user' for nil:NilClass并且它有效,没有@current_resource.instance_variable_get(:@user)错误。这是怎么回事? 为什么@current_resource.user有效但{{1}}无效?

1 个答案:

答案 0 :(得分:1)

所以Chef的资源属性不像Ruby的访问者那样工作(你不应该混合它们)。在提供程序中执行该集的方法是@current_resource.user(@new_resource.user)。这是因为属性方法实际上已经过优化,可以在配方DSL块中使用(您可以使用user 'foo')。