Skip to content

Instantly share code, notes, and snippets.

@joerichsen
Created June 5, 2012 06:23
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save joerichsen/2873091 to your computer and use it in GitHub Desktop.
Save joerichsen/2873091 to your computer and use it in GitHub Desktop.
Microgem for compiling assets in parallel
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
s.name = 'parallel_assets_compiler'
s.version = '0.2.0'
s.platform = Gem::Platform::RUBY
s.author = 'Jørgen Orehøj Erichsen'
s.email = 'joe@erichsen.net'
s.summary = 'Compile assets in parallel'
s.description = 'Compile assets in parallel to speed up deployment'
s.files = ['parallel_assets_compiler.rb']
s.require_path = '.'
s.add_dependency('parallel')
s.add_dependency('actionpack')
end
# Compile assets in parallel to speed up deployment
#
# Works by monkey patching actionpack from Rails 3.2.5
#
# Use it by adding this to your Gemfile and run bundle install
#
# gem 'parallel_assets_compiler', :git => 'git://gist.github.com/2873091.git'
#
# Inspired by
# https://github.com/steel/sprockets/commit/6327afc3341e34efd1dfdcfad08e3b9d85f7fd4a
# https://github.com/hornairs/sprockets-rails-parallel
require 'sprockets/static_compiler'
require 'parallel'
module Sprockets
class StaticCompiler
def compile
# Collect paths
logical_paths = []
env.each_logical_path do |logical_path|
if File.basename(logical_path)[/[^\.]+/, 0] == 'index'
logical_path.sub!(/\/index\./, '.')
end
logical_paths << logical_path if compile_path?(logical_path)
end
# Compute!
results = Parallel.map(logical_paths) do |logical_path|
if asset = env.find_asset(logical_path)
[logical_path, write_asset(asset)]
end
end
write_manifest(Hash[results]) if @manifest
end
end
end
@masterkain
Copy link


Undumpable Exception -- #<NoMethodError: undefined method `options=' for true:TrueClass>
/Users/kain/.rvm/gems/ruby-1.9.3-p194/gems/parallel-0.5.18/lib/parallel.rb:173:in `work_in_processes'
/Users/kain/.rvm/gems/ruby-1.9.3-p194/gems/parallel-0.5.18/lib/parallel.rb:55:in `map'

@butsjoh
Copy link

butsjoh commented Sep 26, 2012

same issue Undumpable Exception -- #<NoMethodError: undefined method `options=' for true:TrueClass>

@aaronjensen
Copy link

I get this w/ sprockets 2.2.2:

undefined method `compile_path?' for #<Sprockets::StaticCompiler:0x007fa14f4fc048>
/Users/user/bundle/ruby/1.9.1/bundler/gems/2873091-2e1e123a0036/parallel_assets_compiler.rb:26:in `block in compile'

@aaronjensen
Copy link

Looks like that method may have been removed from actionpack? I tried this one from turbo-sprockets-rails3:

      private
      def compile_path?(logical_path)
        paths.each do |path|
          case path
          when Regexp
            return true if path.match(logical_path)
          when Proc
            return true if path.call(logical_path)
          else
            return true if File.fnmatch(path.to_s, logical_path)
          end
        end
        false
      end

It worked fine on my dev box, but on my build agent I got the Undumpable Exception :(

@afeld
Copy link

afeld commented May 30, 2013

Make it a real gem!

@morganchristiansson
Copy link

Doesn't work with compile_path? error.

Make it a real gem!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment