discourse/lib/tasks/assets.rake

74 lines
2.2 KiB
Ruby

task 'assets:precompile:before' do
unless %w{profile production}.include? Rails.env
raise "rake assets:precompile should only be run in RAILS_ENV=production, you are risking unminified assets"
end
# Ensure we ALWAYS do a clean build
# We use many .erbs that get out of date quickly, especially with plugins
puts "Purging temp files"
`rm -fr #{Rails.root}/tmp/cache`
# in the past we applied a patch that removed asset postfixes, but it is terrible practice
# leaving very complicated build issues
# https://github.com/rails/sprockets-rails/issues/49
# let's make precompile faster using redis magic
require 'sprockets'
require 'digest/sha1'
require_dependency 'discourse_sass_importer'
Sprockets::SassImporter = DiscourseSassImporter
module ::Sprockets
def self.cache_compiled(type, data)
digest = Digest::SHA1.hexdigest(data)
key = "SPROCKETS_#{type}_#{digest}"
if compiled = $redis.get(key)
$redis.expire(key, 1.week)
else
compiled = yield
$redis.setex(key, 1.week, compiled)
end
compiled
end
class SassCompressor
def evaluate(context, locals, &block)
::Sprockets.cache_compiled("sass", data) do
# HACK, SASS compiler will degrade to aweful perf with huge files
# Bypass if larger than 500kb, ensure assets are minified prior
if context.pathname &&
context.pathname.to_s =~ /.css$/ &&
data.length > 500.kilobytes
puts "Skipped minifying #{context.pathname} cause it is larger than 200KB, minify in source control or avoid large CSS files"
data
else
::Sass::Engine.new(data, {
:syntax => :scss,
:cache => false,
:read_cache => false,
:style => :compressed
}).render
end
end
end
end
class UglifierCompressor
def evaluate(context, locals, &block)
::Sprockets.cache_compiled("uglifier", data) do
Uglifier.new(:comments => :none).compile(data)
end
end
end
end
end
task 'assets:precompile' => 'assets:precompile:before'