just a project command center
I used to use the venerable make(1)
as my project command runner. I would cd
into a project I hadn’t touched in
awhile, run make test
and be off to the races. I didn’t have to remember whether we used nose or pytest or whether
this was a go project or node. make test
would do the right thing. As a person who often has several balls in the air
across several different ecosystems this is invaluable. make
, however, is not without its warts. It was designed to
build dependencies, not to run commands. If you want to use make
in this way you have to declare every target as
.PHONY
which means it doesn’t produce any files and that target will never be up to date (so it should run every
time). Another problem with make
is that despite the fact that it seems to be a standard, there are many
implementations which don’t all have the same features. Wikipedia has a decent list of the disparate
implementations.
There have been efforts to replace make
over the years as a command runner, but I haven’t found them to be that
compelling. Aside from some oddities in syntax (hope your editor is set up to only use tabs!) and the fact that writing
an if statement in makefile syntax is borderline impossible it’s relatively concise. Most of its newer competitors have
decided on yaml which trades makefile’s syntax oddities for yaml’s, and I find yaml’s to be much more pernicious. The
one exception I’ve found has been just
, which takes makefile syntax, cleans it up a little and adds a ton of niceties
like built-in help (have you ever used self-documenting make
help? I have, it’s not great!), built in shell completion, it
allows you to use arguments and it has many many more features besides. In short, it’s a project command center for the
21st century.
I encourage you to check it out.