Blog of Rob Galanakis (@robgalanakis)

Makefile 🤝 JavaScript

How many times have you heard this?

“I ran npm install and it failed.”

“I installed a new module and the lockfile is totally different.”

“The app won’t boot.”

And how many times has the answer been:

“What version of node are you running?”

I can hear you clacking away at your keyboard: “Use a version manager!”

And to that I say: We do! But you have to either manually activate the version manager (nvm use, fnm use, etc.), or install a script that runs constantly in your shell. Many folks don’t want to do the latter, and we often forget to do the former.

Make to the rescue (again)

If you’ve read the other articles in this series, you know we love using Make as a task runner, similar to how you use npm test or npm run prettier.

Well, when we use Make with JavaScript (and most other languages), you still use npm, except it’s wrapped in a Make target like:

test:
    npm test

The special sauce is a few lines of JavaScript we put into a tools/checkversion.js file in each repo:

const fs = require("fs");

const nvmVersion = fs
  .readFileSync(".nvmrc")
  .toString()
  .trim();
const desired = `v${nvmVersion}`;
const running = process.version;

if (!running.startsWith(desired)) {
  console.error(
    `You are running Node ${running} but version ${desired} is expected. ` + 
    `Use nvm or another version manager to install ${desired}, and then activate it.`
  );
  process.exit(1);
}

You may need to modify that script if you want to use .node-version instead of .nvmrc or if you use a different version manager.

Then in the Makefile, we guard all the targets that invoke node and npm to check the active node version. For example, part of the Makefile for our very own marketing site looks like this:

check-version:
    @node tools/checkversion
install: check-version
    yarn install
develop: check-version
    gatsby develop
build: check-version
    gatsby build
serve:
    gatsby serve
run-prod: build serve
fmt: check-version
    yarn run format
    yarn run sort-imports
test: check-version
    yarn test

So if you cd over to a JS project and you forget to activate your version manager, instead of some cryptic error, it looks like this:

$ make test
 You are running Node v12.16.1 but version v12.10 is expected. Use nvm or another version manager to install v12.10, and then activate it.
 make: *** [check-version] Error 1
$ nvm use
 Found '/Users/rob/lithic/lithic-marketing-gatsby/.nvmrc' with version <12.10>
 Now using node v12.10.0 (npm v6.10.3)
$ make test
 yarn run test
 yarn run v1.22.4

WOW, isn’t that better! We strongly suggest you take this JS snippet and Makefile with you on your current and future projects. And if this was helpful, you should also check out the rest of this series: how to use wildcards using application presets, and configuring Make targets with dotenv.

Don’t miss next week

Next week, we’ll wrap up this series by addressing why we use Make as a task runner in more holistic and philosophical terms. To balance the theoretical with the practical, we’ll also include a bunch of snippets we have used in our Makefiles over the last year, that we go back to over and over.

This was originally posted on my consultancy’s blog, at https://lithic.tech/blog/2020-05/makefile-and-node. If you have any questions, please leave a comment or get in touch!

Leave a Reply