07 April 2012
CoffeeScript is brilliant, but using it has also resulted in wasted time trying to debug new code. I wondered why it didn’t seem to be doing anything only to realise I hadn’t started the compiler this session. None of my lovely new code was making it to the browser.
There must be a better way, and there is. It is one that resolves my OCD discomfort at having to leave a terminal running hosting the compiler, and that way is LaunchAgents.
LaunchAgents are OS X’s init.d, cron and such all rolled into a series of property list files that can be system wide or per-user. Creating one for CoffeeScript is dead simple.
I’m making some assumptions here that you’ve installed Node.js from Homebrew. If you’re not using Homebrew then you probably should be. I’m assuming you’ve then also installed CoffeeScript using npm and that you’ve not changed any of the default paths. If you have then you’ll want to adjust the recipe to suit.
All that’s required is a file like this stored in
~/Library/LaunchAgents and named appropriately.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>KeepAlive</key> <true/> <key>Label</key> <string>me.s-n.app.CoffeeScript</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/node</string> <string>/usr/local/bin/coffee</string> <string>-w</string> <string>--output</string> <string>/Users/stephen/Sites/s-n.me/app</string> <string>--compile</string> <string>/Users/stephen/Sites/s-n.me/source</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
RunAtLoad makes sure the compiler launches whenever you log in.
KeepAlive restarts the compiler in case it bums out for any reason.
To start it manually now, you can use the
launchctl load ~/Library/LaunchAgents/me.s-n.app.coffeescript.plist
If you want to stop it for any reason, replace
You can check for any errors using
Console.app. All the usual compiler
output will be directed to your system log.
The agent is simple to adapt to any watchful compiler, just change the
strings inside the
ProgramArguments array accordingly. I also use it