Skip to content

grosser/rails2_asset_pipeline

Repository files navigation

Rails 2 Asset pipeline

Familiar asset handling for those stuck on Rails 2.

  • sprockets/coffee/sass etc goodness
  • application.js?time for development
  • application-MD5.js for production (and development without config.ru, read from public/assets/manifest.json)
  • old asset versions can stay around during deploys
  • converter for jammit asset.yml
  • no forced monkey-patching, everything is opt-in

Example application

Usage

rake assets:precompile
rake assets:clean
rake assets:remove_old      # Keeps current + 2 older versions in public/assets
rake assets:convert_jammit  # reads config/assets.yml and converts packs into `app/assets/<type>/<pack>.js` with `//= require <dependency>`
With ViewHelpers included you can:
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>
<%= image_tag "foo.jpg" %> <-- will go to public if you set Rails2AssetPipeline::ViewHelpers.ignored_folders = ["images"]
From good old public <%= javascript_include_tag "/javascripts/application.js" %>
Just a path: <%= asset_path "application.js" %>

Install

gem install rails2_asset_pipeline

# config/environment.rb
config.gem "rails2_asset_pipeline"

# Gemfile (if you have one)
gem "rails2_asset_pipeline"

group :development do
  gem "coffee-script", :require => false # need coffee ?
  gem "sass", :require => false # need sass ?
  gem "sprockets-sass", :require => false
end

Initializer

Here you can do configuration of sprockets.

  • loaded in rake assets:precompile without the rails environment (to enable compiling/deploying without development environment)
  • configure sprockets
  • require sprockets extensions like sprockets/sass
# config/initializers/rails2_asset_pipeline.rb
if Rails.env.development? # dynamic asset compilation needs these
  require 'coffee-script' # need coffee ?
  require 'sprockets/sass' # need sass ?
  autoload :Sass, 'sass' # autoload when used via rake assets:precompile
  require 'sprockets/source_url' # sprockets-source_url for debugable assets in chrome
end

# Use a different path for assets (as in config.assets.prefix from ")
# Rails2AssetPipeline.prefix = 'static_assets'

Rails2AssetPipeline.setup do |sprockets|
  # ... additional config ...
end

# let image_tag still go to public/images
require 'rails2_asset_pipeline/view_helpers'
Rails2AssetPipeline::ViewHelpers.ignored_folders = ["images"]

Optional: remove unnecessary Sass middleware + monkey-patches

# config/environment.rb
...

module Sass; RAILS_LOADED = true; end # prevent sass middleware + monkeypatches -> all handled by rails2_asset_pipeline (verify via: rake middleware | grep Sass)

Rails::Initializer.run do
...

Tasks

# Rakefile
begin
  require "rails2_asset_pipeline/tasks"
rescue LoadError
  puts "rails2_asset_pipeline is not installed, you probably should run 'rake gems:install' or 'bundle install'."
end

Dynamic assets for development

Setup a config.ru so development has dynamic assets

# config.ru
# we need to protect against multiple includes of the Rails environment (trust me)
require './config/environment' if !defined?(Rails) || !Rails.initialized?

Rails2AssetPipeline.config_ru(self)

map '/' do
  use Rails::Rack::LogTailer unless Rails.env.test?
  # use Rails::Rack::Debugger unless Rails.env.test?
  use Rails::Rack::Static
  run ActionController::Dispatcher.new
end

View helpers

# app/helpers/application_helper.rb
require 'rails2_asset_pipeline/view_helpers'
module ApplicationHelper
  include Rails2AssetPipeline::ViewHelpers
  ...
end

Static code

You can also use Rails2AssetPipeline::ViewHelpers.asset_path("application.js")

Fast tests

To not compile assets during testing you can overwrite the manifest.

# spec/fixtures/empty_manifest.json
{"assets": {}, "files": {}}

# spec/spec_helper.rb
Rails2AssetPipeline.manifest = Rails.root.join("spec/fixtures/empty_manifest.json")

Images vs CSS

/* application.css */
.image_via_sass_url{
  background: url('ok.gif');
}

/* application.css.erb ... not recommended but possible ... */
.image_with_erb{
  background-image:url(<%= asset_data_uri 'ok.gif' %>);
}

Sass

  • add sass to your gems for sass parsing
  • add sprockets-sass to your gems for sass @import support

Todo

  • read config from Rails 3 style config.assets
  • sprockets 2.8 wants to use manifest-digest.json, had to overwrite that, find out if nonpstatic manifest makes sense for us and potentially have an option to turn it on

Author

Michael Grosser
michael@grosser.it
License: MIT
Build Status

About

Familiar asset handling for those stuck on Rails 2

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages