diaspora/lib/tasks/assets.rake
Benjamin Neff 3c4da76be5
Fix follow up tasks for assets:precompile when no manifest existed
When no `.sprockets-manifest-xxx.json` existed, every instance of
`Sprockets::Manifest` generated their own path with their own random
filename, and since this happened before the assets were actually
precompiled, they were all empty. So the error pages didn't find the
manifest and the non-digest assets also didn't have any assets to copy.

So lets create our own instance of `Sprockets::Manifest` here, AFTER
`assets:precompile`, which then loads the manifest json that was used
during precompile, so all precompiled assets are available.

closes #8366
2022-07-20 21:32:21 +02:00

41 lines
1.6 KiB
Ruby

# frozen_string_literal: true
namespace :assets do
# create new assets manifest for tasks which run after assets:precompile
def assets_manifest
return @assets_manifest if @assets_manifest
config = Diaspora::Application.config
path = File.join(config.paths["public"].first, config.assets.prefix)
@assets_manifest = Sprockets::Manifest.new(Diaspora::Application.assets, path, config.assets.manifest)
end
desc "Generate error pages"
task generate_error_pages: :environment do
ApplicationController.view_context_class.assets_manifest = assets_manifest
renderer = ErrorPageRenderer.new codes: [404, 422, 500]
renderer.render
end
desc "Create non digest assets"
task non_digest_assets: :environment do
Diaspora::Application.config.assets.non_digest_assets.each do |asset|
digested_path = assets_manifest.assets[asset]
raise Sprockets::Rails::Helper::AssetNotFound, "Precompiled asset for '#{asset}' not found" unless digested_path
full_digested_path = File.join(assets_manifest.directory, digested_path)
full_non_digested_path = File.join(assets_manifest.directory, asset)
next unless FileUtils.uptodate?(full_digested_path, [full_non_digested_path])
puts "Copying #{full_digested_path} to #{full_non_digested_path}"
FileUtils.copy_file(full_digested_path, full_non_digested_path, true)
end
end
# Augment precompile with error page generation
Rake::Task[:precompile].enhance do
Rake::Task["assets:generate_error_pages"].invoke
Rake::Task["assets:non_digest_assets"].invoke
end
end