我有用於安裝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
這是一個很好的點。這是我累了的功能,而不是我的愚蠢。 :) –