13

Is there a way to pass command line arguments to an npm 'pre' script or to a script which runs multiple commands?

Assuming a simple script mySexyScript.js that just logs out the process.argv :

console.log(process.argv);

This works

With an npm script:

...
"scripts": {
    ....
    "sexyscript": "node mySexyScript.js"
    ....
}
...

running:

npm run sexyscript -- --foo=bar

the arguments are logged to the console as expected.

'pre' script - This doesn't work

With an npm script:

...
"scripts": {
    ....
    "presexyscript": "node mySexyScript.js"
    "sexyscript": "node mySuperSexyScript.js"
    ....
}
...

running:

npm run sexyscript -- --foo=bar

the arguments are not passed to mySexyScript and they are not logged

Multiple commands - This also doesn't work

With an npm script:

...
"scripts": {
    ....
    "sexyscript": "node mySexyScript.js && node mySuperSexyScript.js"
    ....
}
...

running:

npm run sexyscript -- --foo=bar

the arguments are not passed to mySexyScript and they are not logged

Fraser
  • 14,036
  • 22
  • 73
  • 118

1 Answers1

7

There is no way to pass args in the way that you are describing.

Assuming a package.json:

...
"scripts": {
    ....
    "somescript": "node one.js && node two.js"
    ....
}
...

Running:

npm run somescript -- --foo=bar

basically just runs

node one.js && node two.js --foo=bar

on the default system shell (usually bash or cmd.exe).

npm doesn't actually know anything about shell operators (i.e. &&), so it can't pass args to both scripts.

RyanZim
  • 6,609
  • 1
  • 27
  • 43