Force yarn install instead of npm install for Node module?

UPDATE: Alexander’s answer is the better solution and uses the same technique I describe here. I am leaving my answer in tact for posterity. The original point of my answer was to show that you can execute a small node script which should work on all platforms.

In your preinstall script you can run a mini node script which should work on all platforms, whereas things like pgrep (and other common *nix commands and operators) won’t work on Windows until Windows 10 has received widespread adoption.

I tested the below script on Node v4.7.0 (npm v2.15.11) and Node v7.2.1 (npm v3.10.10). I assume it works on everything in between. It works by checking the environment variables on the currently running process – the npm_execpath is the path to the currently running “npm” script. In the case of yarn, it should point to /path/to/yarn/on/your/machine/yarn.js.

"scripts": {
    "preinstall": "node -e \"if(process.env.npm_execpath.indexOf('yarn') === -1) throw new Error('You must use Yarn to install, not NPM')\""
}

You can read more about npm scripts here: https://docs.npmjs.com/misc/scripts

As far as the npm_execpath environment variable, while not documented I doubt that it will ever change. It’s been around for multiple major releases of npm and it doesn’t really pass the “there’s a better name for this” test.

Leave a Comment