Everything goes well in local machine with assets pipeline in Rails 4 and Ruby 2.0. But when deploying to heroku, it is shown that:
-----> Preparing app for Rails asset pipeline
Running: rake assets:precompile
I, [2013-03-12T03:28:29.908234 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/rails-2ee5a98f26fbf8c6c461127da73c47eb.png
I, [2013-03-12T03:28:29.914096 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/trash-3c3c2861eca3747315d712bcfc182902.png
I, [2013-03-12T03:28:33.963234 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-bf2525bd32aa2a7068dbcfaa591b3874.js
I, [2013-03-12T03:28:40.362850 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-13374a65f29a3b4cea6f8da2816ce7ff.css
Asset precompilation completed (14.36s)
Heroku seems to compile files but put it in /tmp without any errors. My questions are:
- How come Heroku compile assets files to /tmp?
- My last solution was to run RAILS_ENV=production bundle exec rake assets:precompile locally, but this generated a manifest-xxxxxx.json in public/assets, rather than manifest.yml, so that heroku doesn't detect the JSON manifest file. I sorted it out by manually created a yml from the json file and heroku became happy. Has heroku's approach been outdated?
Add this gem
gem 'rails_serve_static_assets'
https://github.com/heroku/rails_serve_static_assets
I added this to the top of one of my css.scss files in the assets/stylesheets/ folder.
then ran..
and...
In Rails 4.2.4 your production.rb has the line:
That means,
gem 'rails_12factor', group: :production
doesn`t need to change it to true, as it can be set through the heroku environment variables. You also will get a warning if you remove the rails_12factor gem.If you have problems with assets, login to the heroku console
heroku run rails console
and find out the asset path for a fileputs helper.asset_path("application.js")
.One strange behaviour I noticed between development and production, when the file ending is not provided:
With a image
/assets/images/image_01.jpg
the following output fromasset_paths
differs:Development:
Production:
You do not have to run
RAILS_ENV=production rake assets:precompile
, heroku does this for you during deploy. Also you do not have to precompile the assets in development and push them to heroku.I figure I'll add this as an answer since this question is linked from the Heroku Support page if you search for
"assets"
.This is mostly for people who are updating their app to Rails 4, but after going through this - and many other SO posts - what finally got me was changing the following in
production.rb
:To:
I hadn't caught this when I upgraded and as usual this took me forever to figure out. Hopefully it helps someone else! Shout out to PatrickEm who asked/answered the same in his question.
In my case, assets compiled following the instructions above but it wasn't picking the bootstrap glyphicons 'fontawesome-webfont' so this worked for me finally after wasting so many hours researching.
Gem file
bundle install
config/application.rb
environment/production.rb
Then finally, I ran
rake assets:precompile RAILS_ENV=production
and pushed it to heroku and that worked.This was an issue with the Heroku Ruby Buildpack, but an update was deployed today (2013-05-21). Please try it out and let us know.
To answer your questions:
#1) This is sprockets output; things are compiled to
/tmp
and then moved (See here in Sprockets). To my knowledge this has always been done this way, but it wasn't until Sprockets version was updated in Rails that we got this new debug-type output.#2) Previously
assets:precompile
genereated amanifest.json
file, but now in Rails 4 the manifest file has a fingerprint in it, which wasn't detected previously. This was fixed with #74.