How to compile SASS/SCSS files when deploying a Django app to Heroku
I'm using django-sass-processor to automatically
compile the SASS files in a Django 2.1 project. Everything runs fine locally,
but on Heroku the pages appear unstyled. The problem is that Heroku only runs
./manage.py collectstatic when building a Django app. This simply copies the
static files to the ./staticfiles folder. As the SCSS files weren't compiled
yet, only the *.scss files end up in that folder.
The solution is simple: customizing how Heroku builds our Django app.
Heroku's Python buildpack offers two hooks, pre_compile
and post_compile. To use them, we just need to add bin/pre_compile or
bin/post_compile in our app's repository. For compiling SCSS, we want to use
post_compile, as it will only run after all pip packages are installed.
Create a file in bin/post_compile in the root of your repository with the
contents:
#!/usr/bin/env bash
cd "$1" || exit 1
echo "-----> Compiling SCSS"
python manage.py compilescss --traceback
echo "-----> Collecting static files"
python manage.py collectstatic --noinput --traceback
The first command, cd "$1", changes the current directory to the build
directory passed in by Heroku. Then we just run the compilescss and
compilestatic as needed.
If you commit this file and deploy to Heroku, you should already see the SCSS
compilation working. The only remaining step is a small optimization. We want
to avoid Heroku running compilestatic, as we're running it ourselves. Simply
run:
heroku config:set DISABLE_COLLECTSTATIC=1 --app <YOUR_APP_NAME>
That's it! Everything should be running fine, and if you need to add other
build steps (e.g. minifying, compressing images, etc.), just add them to the
bin/post_compile file.
You can see how I've done in my Django project on https://github.com/vitorbaptista/lainonima.