One of the irritating constants of the development process is the necessity of doing the same things over and over again. Every time you deploy a Symfony2 project, for example, there’s pretty much a checklist that has to be followed:
- Pull from the remote repo
bin/vendors installif any of the vendor requirements have changed
- Update the database schema if your entities have changed
- Clear the opcode cache
- Clear Symfony2’s production cache
And if you forget a step, it takes even longer to go back and correct it. So, I wrote a handful of shell scripts that automate some common processes; namely, testing and deployment. They worked fine until coworkers start coming to me and saying things like, “I really don’t want to have to run the vendors install every time if I KNOW that the vendors haven’t changed,” or, “Your deploy script requires a manual update of the database schema; can you add a flag that I can use locally to do it automatically?”
I’m no bash scripting expert, so when I realized that it was going to take longer to figure out how to update my deployment script than it would to rewrite it as a PHP CLI script, I sat down and hacked something out quickly. Then I looked at my testing script, and found that I’d be copy-pasting a lot of the same code to deal with command-line arguments and switches. So, I came up with another solution.
HashBang is a console app microframework that I hammered out in a couple of hours one night. Its purpose is to abstract away some of common code in a CLI script — dealing with optional and required arguments, and supporting command-line switches — and let you focus on what your script should actually be doing. You simply tell your HashBang app what arguments and switches to expect, and pass it a closure to execute when you call
go(). Check it out:
That’s it. Obviously, it’s not as full-featured as some of the other solutions out there might be, but it’s quick and dirty and gets the job done.