Written by Katherine Giron Pe
on
on
Package Assets For Rails 3 and Upload to Amazon s3
I like to share this quickly for those who are concerned about application performance. Rails has always provided a way to cache assets. It’s been very simple but when we think about the “cloud” and scaling, we realized it’s a pain to actually make it all work with amazon s3.
We need a command line solution or some rake tasks and asset packager plugin provides these for us.
I’ve updated the plugin, asset_packager for Rails 3.0.1. Click here to check it out (git).
How to install
rails plugin install git://github.com/kathgironpe/asset_packager.git
One rake task to cache and upload assets
namespace :cache do
BUCKET = 'bucketname'
desc "start aws"
task :aws do
require 'aws/s3'
AWS::S3::Base.establish_connection!(
access_key_id: 'key',
secret_access_key: 'secret'
)
end
desc "update s3"
task :s3=> :aws do
prefix = ''
files = Dir[
"./public/stylesheets/admin_all_packaged.css",
"./public/stylesheets/splash_all_packaged.css",
"./public/stylesheets/all_packaged.css",
"./public/javascripts/admin_all_packaged.js",
"./public/javascripts/splash_all_packaged.js",
"./public/javascripts/all_packaged.js"
]
files.each do |f|
next if File.directory?(f)
puts f
key = f.gsub(/\.\/public/, prefix)
puts " -> %s" % key
AWS::S3::S3Object.store(
key, File.open(f), BUCKET,
:access => :public_read, 'Cache-Control' => 'max-age=315360000'
)
end
end
desc "cache assets and update s3 for production"
task :production do
Rake::Task['asset:packager:delete_all'].invoke
Rake::Task['asset:packager:build_all'].invoke
Rake::Task['cache:s3'].invoke
end
end
How to use
rake cache:production
It’s sort of saying cache all assets for production.
Thanks to Marco Palinar and Cyril David for sharing a similar gist on how to upload assets to Amazon s3 through a very simple rake task.