我已经将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.user
在nil
中登录时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}}无效?
答案 0 :(得分:1)
所以Chef的资源属性不像Ruby的访问者那样工作(你不应该混合它们)。在提供程序中执行该集的方法是@current_resource.user(@new_resource.user)
。这是因为属性方法实际上已经过优化,可以在配方DSL块中使用(您可以使用user 'foo'
)。