class Chef::Cookbook::GemInstaller
Attributes
cookbook_collection[RW]
@return [Chef::CookbookCollection] the cookbook collection
events[RW]
@return [Chef::EventDispatch::Dispatcher] the client event dispatcher
Public Class Methods
new(cookbook_collection, events)
click to toggle source
# File lib/chef/cookbook/gem_installer.rb, line 30 def initialize(cookbook_collection, events) @cookbook_collection = cookbook_collection @events = events end
Public Instance Methods
install()
click to toggle source
Installs the gems into the omnibus gemset.
# File lib/chef/cookbook/gem_installer.rb, line 37 def install cookbook_gems = Hash.new { |h, k| h[k] = [] } cookbook_collection.each_value do |cookbook_version| cookbook_version.metadata.gems.each do |args| if cookbook_gems[args.first].last.is_a?(Hash) args << {} unless args.last.is_a?(Hash) args.last.merge!(cookbook_gems[args.first].pop) do |key, v1, v2| raise Chef::Exceptions::GemRequirementConflict.new(args.first, key, v1, v2) if v1 != v2 v2 end end cookbook_gems[args.first] += args[1..-1] end end events.cookbook_gem_start(cookbook_gems) unless cookbook_gems.empty? begin Dir.mktmpdir("chef-gem-bundle") do |dir| File.open("#{dir}/Gemfile", "w+") do |tf| Array(Chef::Config[:rubygems_url] || "https://www.rubygems.org").each do |s| tf.puts "source '#{s}'" end cookbook_gems.each do |gem_name, args| tf.puts "gem(*#{([gem_name] + args).inspect})" end tf.close Chef::Log.trace("generated Gemfile contents:") Chef::Log.trace(IO.read(tf.path)) so = shell_out!("bundle install", cwd: dir, env: { "PATH" => path_with_prepended_ruby_bin }) Chef::Log.info(so.stdout) end end Gem.clear_paths rescue Exception => e events.cookbook_gem_failed(e) raise end end events.cookbook_gem_finished end
Private Instance Methods
path_with_prepended_ruby_bin()
click to toggle source
path_sanity appends the ruby_bin, but I want the ruby_bin prepended
# File lib/chef/cookbook/gem_installer.rb, line 85 def path_with_prepended_ruby_bin env_path = ENV["PATH"].dup || "" existing_paths = env_path.split(File::PATH_SEPARATOR) existing_paths.unshift(RbConfig::CONFIG["bindir"]) env_path = existing_paths.join(File::PATH_SEPARATOR) env_path.encode("utf-8", invalid: :replace, undef: :replace) end