A CLI tool to run npm scripts with either npm
or yarn
, depending on how it was started. Useful for setups where
some team members use npm
while others use yarn
, especially when Windows and Unix-like systems are used across the
team.
This tool is a helper to run scripts from package.json
. Just substitute all npm
or yarn
calls with yarpm
and you're good to go:
{
"scripts": {
"start": "yarpm run build",
"build": "tsc index.ts"
}
}
When running the start
script with yarn start
, the dependent build
script will be spawned with yarn
:
~/test$ yarn start
yarn start v0.21.3
$ yarpm run build
yarn run v0.21.3
$ tsc index.ts
Done in 1.92s.
Done in 2.27s.
Running the same script with npm start
will result in the dependent build
being run with npm
:
~/test$ npm start
> [email protected] start /home/me/test
> yarpm run build
> [email protected] build /home/me/test
> tsc index.ts
This tool is not meant to be an abstraction layer for calling npm
or yarn
. It will pass all arguments it receives
unfiltered to the chosen package manager. So you could create the following package.json
and pass the -s
flag to
yarpm
to silence npm
output:
{
"scripts": {
"start": "yarpm run -s build",
"build": "tsc index.ts"
}
}
This will work if you invoke the script with npm start
. Running the script with yarn start
will result in the
following error:
yarn run v0.21.3
error No command specified.
....
This is due to the fact that yarn
doesn't understand the -s
option. This is up to you to write your scripts so
that only commands and options available to both npm
and yarn
are used.
$ npm install yarpm --save-dev
# or
$ yarn add yarpm --dev
The yarpm
package provides 2 CLI commands:
The main command is yarpm
.
This command is an in-place substitute for places in package.json
where npm
or yarn
is being used explicitly.
It reads the npm_execpath
environment variable to determine the path to the currently used package manager. This env
var is only set when running yarpm
as a script. If yarpm
is used without being embedded in a script, it will
always choose npm
.
This command can be used in places where you are not in control of how your script is being started, for example when
using husky
to run a script as a git hook. This script will always prefer yarn
over npm
unless yarn
is not
available. Only then will it fall back to npm
.
The yarpm
package provides a node API.
const yarpm = require('yarpm');
const promise = yarpm(argv, options);
- argv
string[]
-- The argument list to pass to npm/yarn. - options
object|undefined
- options.npmPath
string
- The path to npm/yarn. Default isprocess.env.npm_execpath
if set,npm
otherwise. - options.env
object
- Sets the environment key-value pairs, replaces the default usage of process.env to spawn child process. - options.stdin
stream.Readable|null
-- A readable stream to send messages to stdin of child process. If this isnull
orundefined
, ignores it. If this isprocess.stdin
, inherits it. Otherwise, makes a pipe. Default isnull
. Set toprocess.stdin
in order to send from stdin. - options.stdout
stream.Writable|null
-- A writable stream to receive messages from stdout of child process. If this isnull
orundefined
, cannot send. If this isprocess.stdout
, inherits it. Otherwise, makes a pipe. Default isnull
. Set toprocess.stdout
in order to print to stdout. - options.stderr
stream.Writable|null
-- A writable stream to receive messages from stderr of child process. If this isnull
orundefined
, cannot send. If this isprocess.stderr
, inherits it. Otherwise, makes a pipe. Default isnull
. Set toprocess.stderr
in order to print to stderr.
- options.npmPath
yarpm
returns a promise will be resolved when the spawned process exits, regardless of the exit code.
The promise will be rejected in case of an internal error inside of yarpm
.
The promise is resolved with an object with the following 2 properties: spawnArgs
and code
.
The spawnArgs
property contains the array of parameters that were passed to spawn the sub-process.
The code
property is the exit code of the sub-process.
yarpm(['install']).then(result => {
console.log(`${result.spawnArgs} -- ${result.code}`);
// if executed as a package.json script via yarn: /usr/share/yarn/bin/yarn.js,install -- 0
});
https://github.com/BendingBender/yarpm/blob/master/CHANGELOG.md
Thank you for contributing!
Please use GitHub Issues.