module IronWorkerNG module Feature module Ruby module MergeGem def self.merge_binary? @merge_binary ||= false end def self.merge_binary=(merge_binary) @merge_binary = merge_binary end class Feature < IronWorkerNG::Feature::Base attr_reader :spec def initialize(code, spec) super(code) @spec = spec if @spec.name == 'nokogiri' && @spec.version.to_s.start_with?('1.6.') && (not code.use_build_cache) IronCore::Logger.warn 'IronWorkerNG', "WARNING: Building nokogiri version #{@spec.version} will take a lot of time. Switching to version '~> 1.5.9' should fix this" end end def gem_path path = @spec.full_gem_path # bundler fixes ['/gems/' + @spec.full_name, '/gems'].each do |bad_part| path.gsub!(bad_part + '/lib' + bad_part, bad_part) path.gsub!(bad_part + bad_part, bad_part) end path end def bundle(container) if not @code.full_remote_build if @spec.extensions.length == 0 || IronWorkerNG::Feature::Ruby::MergeGem.merge_binary? IronCore::Logger.debug 'IronWorkerNG', "Bundling ruby gem with name='#{@spec.name}' and version='#{@spec.version}'" loaded_from = @spec.loaded_from # yet another bundler fix if loaded_from.end_with?("/gems/bundler-#{@spec.version}/lib/bundler") loaded_from = loaded_from.gsub("/gems/bundler-#{@spec.version}/lib/bundler", "/specifications/bundler-#{@spec.version}.gemspec") end # and yet another one if loaded_from.end_with?("/gems/bundler-#{@spec.version}/lib/bundler/source") loaded_from = loaded_from.gsub("/gems/bundler-#{@spec.version}/lib/bundler/source", "/specifications/bundler-#{@spec.version}.gemspec") end if File.exists?(gem_path) container_add(container, '__gems__/gems/' + @spec.full_name, gem_path) else from_dir = File.dirname(loaded_from) @spec.files.each do |fname| container_add(container, '__gems__/gems/' + @spec.full_name + '/' + fname, from_dir + '/' + fname) if File.file?(from_dir + '/' + fname) end end container_add(container, "__gems__/specifications/#{@spec.full_name}.gemspec", loaded_from) else IronCore::Logger.warn 'IronWorkerNG', "Skipping ruby gem with name='#{@spec.name}' and version='#{@spec.version}' as it contains native extensions, switching to full remote build should fix this (add 'remote' to your .worker)" end end end end end end end end