The bin/dev
script Ruby on Rails ships with, if you for example init the app with --css=tailwind
or --css=bootstrap
is great. It comes with auto-generated Procfile
that will launch the web server and the Tailwind CSS (or other) preprocessors. In addition bin/dev
will install the foreman
gem if it does not exist on your system.
At some point however, you’ll want to run multiple Rails applications on your developer machine. Doing that with localhost:3000
will get annoying at some point (cookie sharing, changing ports, everyone in the team handling it differently, no HTTPS to test with…).
puma-dev has been around for a long time to solve this. However while it takes care of running the web server part for you (in the background), you still want to see the logs, run your CSS (or JS) preprocessor or compiler, job workers, etc. I figured out it’s simply about adjusting the Procfile
and bin/dev
slightly and one can use the familiar approach in conjunction with all the puma-dev features.
This is what I do:
My Procfile.dev
looks like this:
web: tail -f log/development.log
css: bin/rails tailwindcss:watch
The change is in the web:
stanza. Instead of launching puma server, we simply tail the logs, as puma will be run by puma-dev in the background for you, as soon as you visit your local .test domain.
My bin/dev
looks like this:
#!/usr/bin/env bash
if ! command -v foreman &> /dev/null
then
echo "Installing foreman..."
gem install foreman
fi
if ! command -v puma-dev &> /dev/null
then
echo "Installing puma-dev..."
brew install puma/puma/puma-dev
echo ""
echo "To finish puma-dev setup run:"
echo "sudo puma-dev -setup"
echo "puma-dev -install"
echo "puma-dev link -n myapp ."
echo ""
fi
foreman start -f Procfile.dev
I’ve added a section that installs puma-dev (if your team is using Homebrew) and prints out instructions on how to complete the setup.
For your use case, simple replace “myapp” above with the name of your app.
This feels like sticking to the Rails way and is easily extensible if you also want to launch other services in development, like job workers, by simply adding a stanza in the Procfile.dev
. Neat.