Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Read digests of assets from manifest.yml when precompile is used #2746

Closed
wants to merge 2 commits into from

2 participants

Guillermo Iguaran Xavier Noria
Guillermo Iguaran

Same #2741 but for 3-1-stable

Xavier Noria
Owner

Could you please document this in the asset pipeline guide?

Guillermo Iguaran guilleiguaran CoC: if you are precompiling you want a manifest.yml, if you have a m…
…anifest.yml you want use it and don't fallback to live compiling
e43fa07
Guillermo Iguaran

Added also the commit of #2747

Guillermo Iguaran

Closed, I will open a new one with most recent changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Aug 30, 2011
  1. Guillermo Iguaran
  2. Guillermo Iguaran

    CoC: if you are precompiling you want a manifest.yml, if you have a m…

    guilleiguaran authored
    …anifest.yml you want use it and don't fallback to live compiling
This page is out of date. Refresh to see the latest.
8 actionpack/lib/sprockets/assets.rake
View
@@ -18,7 +18,8 @@ namespace :assets do
config = Rails.application.config
env = Rails.application.assets
- target = Rails.root.join("public#{config.assets.prefix}")
+ target = Pathname.new(File.join(Rails.public_path, config.assets.prefix))
+ manifest = {}
if env.respond_to?(:each_logical_path)
config.assets.precompile.each do |path|
@@ -30,6 +31,7 @@ namespace :assets do
end
if asset = env.find_asset(logical_path)
+ manifest[logical_path] = asset.digest_path
filename = target.join(asset.digest_path)
mkdir_p filename.dirname
asset.write_to(filename)
@@ -43,6 +45,10 @@ namespace :assets do
assets << {:to => target}
env.precompile(*assets)
end
+
+ File.open("#{target}/manifest.yml", 'w') do |f|
+ YAML.dump(manifest, f)
+ end
end
end
15 actionpack/lib/sprockets/helpers/rails_helper.rb
View
@@ -14,6 +14,7 @@ def asset_paths
paths = RailsHelper::AssetPaths.new(config, controller)
paths.asset_environment = asset_environment
paths.asset_prefix = asset_prefix
+ paths.asset_digests = asset_digests
paths
end
end
@@ -74,6 +75,10 @@ def asset_prefix
Rails.application.config.assets.prefix
end
+ def asset_digests
+ Rails.application.config.assets.digests
+ end
+
# Override to specify an alternative asset environment for asset
# path generation. The environment should already have been mounted
# at the prefix returned by +asset_prefix+.
@@ -82,7 +87,9 @@ def asset_environment
end
class AssetPaths < ::ActionView::AssetPaths #:nodoc:
- attr_accessor :asset_environment, :asset_prefix
+ attr_accessor :asset_environment, :asset_prefix, :asset_digests
+
+ class AssetNotPrecompiledError < StandardError; end
def compute_public_path(source, dir, ext=nil, include_host=true, protocol=nil)
super(source, asset_prefix, ext, include_host, protocol)
@@ -101,6 +108,12 @@ def asset_for(source, ext)
end
def digest_for(logical_path)
+ if asset_digests
+ digest = asset_digests[logical_path]
+ raise AssetNotPrecompiledError unless digest
+ return digest
+ end
+
if asset = asset_environment[logical_path]
return asset.digest_path
end
4 actionpack/lib/sprockets/railtie.rb
View
@@ -26,6 +26,10 @@ class Railtie < ::Rails::Railtie
end
end
+ if File.exist?(path = File.join(Rails.public_path, config.assets.prefix, "manifest.yml"))
+ config.assets.digests = YAML.load_file(path)
+ end
+
ActiveSupport.on_load(:action_view) do
include ::Sprockets::Helpers::RailsHelper
7 railties/lib/rails/application/configuration.rb
View
@@ -42,10 +42,9 @@ def initialize(*)
@assets.version = ''
@assets.debug = false
@assets.allow_debugging = false
-
- @assets.cache_store = [ :file_store, "#{root}/tmp/cache/assets/" ]
- @assets.js_compressor = nil
- @assets.css_compressor = nil
+ @assets.cache_store = [ :file_store, "#{root}/tmp/cache/assets/" ]
+ @assets.js_compressor = nil
+ @assets.css_compressor = nil
end
def compiled_asset_path
59 railties/test/application/assets_test.rb
View
@@ -62,6 +62,65 @@ def app
end
end
+ test "precompile creates a manifest file with all the assets listed" do
+ app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
+ app_file "app/assets/javascripts/application.js", "alert();"
+
+ capture(:stdout) do
+ Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
+ end
+
+ manifest = "#{app_path}/public/assets/manifest.yml"
+
+ assets = YAML.load_file(manifest)
+ assert_match /application-([0-z]+)\.js/, assets["application.js"]
+ assert_match /application-([0-z]+)\.css/, assets["application.css"]
+ end
+
+ test "assets do not require any assets group gem when manifest file is present" do
+ app_file "app/assets/javascripts/application.js", "alert();"
+
+ ENV["RAILS_ENV"] = "production"
+ capture(:stdout) do
+ Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
+ end
+ manifest = "#{app_path}/public/assets/manifest.yml"
+ assets = YAML.load_file(manifest)
+ asset_path = assets["application.js"]
+
+ require "#{app_path}/config/environment"
+
+ # Checking if Uglifier is defined we can know if Sprockets was reached or not
+ assert !defined?(Uglifier)
+ get "/assets/#{asset_path}"
+ assert_match "alert()", last_response.body
+ assert !defined?(Uglifier)
+ end
+
+ test "assets raise AssetNotPrecompiledError when manifest file is present and requested file isn't precompiled" do
+ app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'app' %>"
+
+ app_file "config/routes.rb", <<-RUBY
+ AppTemplate::Application.routes.draw do
+ match '/posts', :to => "posts#index"
+ end
+ RUBY
+
+ ENV["RAILS_ENV"] = "production"
+ capture(:stdout) do
+ Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
+ end
+
+ # Create file after of precompile
+ app_file "app/assets/javascripts/app.js", "alert();"
+
+ require "#{app_path}/config/environment"
+ class ::PostsController < ActionController::Base ; end
+
+ get '/posts'
+ assert_match /AssetNotPrecompiledError/, last_response.body
+ end
+
test "precompile appends the md5 hash to files referenced with asset_path and run in the provided RAILS_ENV" do
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
Something went wrong with that request. Please try again.