我有用于安装JRuby的社区主厨食谱。我无法指定要安装的Gem版本。我真的尝试了我能想到的各种哈希,键,字符串等组合。如何在散列中指定参数
下面是代码的相关部分:
default[:jruby][:gems] = ["some-gem", "another-one"]
是的,这是一个字符串数组,但哈希值的阵列应该是可能的。
这是由下面的代码片段阅读:
node[:jruby][:gems].each do |gem|
Chef::Log.info "Installing Jruby Gem #{gem}"
if gem.is_a? Hash
name = gem.delete(:name)
else
name = gem
gem = nil
end
jruby_gem name, gem || {}
end
而在本定义的手结束了:
define :jruby_gem, :source => nil, :version => nil do
gem_package params[:name] do
gem_binary "#{node[:jruby][:install_path]}/bin/gem"
source params[:source] if params[:source]
version params[:version] if params[:version]
end
end
鉴于代码,将填补什么哈希散列的:name
和:version
最终定义中的值?
事情我已经试过在以下领域...
[
{:name => "some-gem", :version => "0.1.2"},
{:name => "another-one"} # I don't need to constrain every Gem to a version
]
编辑:
所以谢谢你的完全正确的Ruby式的反应,但实际上我曾尝试的阵列在转向SO之前,散列方法在一些变体中。疲劳让我错了最初出现在我的问题中的结构。
我看到的问题似乎涉及厨师和您在上面看到的定义。错误我得到的是如下...
Node attributes are read-only when you do not specify which precedence level to set. To set an attribute use code like `node.default["key"] = "value"'
Cookbook Trace:
---------------
/var/chef/cache/cookbooks/jruby/recipes/default.rb:48:in `block in from_file'
/var/chef/cache/cookbooks/jruby/recipes/default.rb:45:in `each'
/var/chef/cache/cookbooks/jruby/recipes/default.rb:45:in `from_file'
Relevant File Content:
----------------------
/var/chef/cache/cookbooks/jruby/recipes/default.rb:
41: notifies :create_if_missing, "file[/etc/profile.d/jruby.sh]"
42: end
43:
44: # install all gems defined in the module
45: node[:jruby][:gems].each do |gem|
46: Chef::Log.info "Installing Jruby Gem #{gem}"
47: if gem.is_a? Hash
48>> name = gem.delete(:name)
49: else
50: name = gem
51: gem = nil
52: end
53: jruby_gem name, gem || {}
54: end
55:
'[“一些宝石”,“另一条”]'是一个数组,而不是一个哈希...... – user12341234
这是一个很好的点。这是我累了的功能,而不是我的愚蠢。 :) –