Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

npm run: how to pass parameter and replace placeholder by param in script call

I want to to define a scripts entry in my package.json to simplify building for several environments.

In the script execution I need to replace $1 (or whatever syntax I need for a placeholder) by a parameter I would pass to npm run build-script like for example --env=prod or even simpler, --prod. How can I do that? Other questions and answers I found here didn't help me solve the problem.

"scripts": { 
  "build-for": "ng build --output-path=../../web/admin-v2 --env=$1 --base-href=\"/admin-v2/\""
}
like image 358
connexo Avatar asked Dec 10 '25 02:12

connexo


1 Answers

I often resort to creating a utility node script for this kind of scenario and invoke it via the scripts section of package.json.


build-for.js

var nodeCLI = require('shelljs-nodecli');

var env = '--env=foo'; // <-- Default env flag/value when no arg provided.

if (process.argv.indexOf('--prod') !== -1) {
  env = '--env=prod';
}

// Check for other possible env values
if (process.argv.indexOf('--quux') !== -1) {
  env = '--env=quux';
}

// Run the ng build command
nodeCLI.exec('ng', 'build', '--output-path=../../web/admin-v2', env, '--base-href=\"/admin-v2/\"');

build-for.js utilizes nodes process.argv to ascertain the argument/flag passed via the CLI and then invokes the ng command (the one currently defined in your package.json) using shelljs-nodecli.

npm i -D shelljs-nodecli

Lets assume that build-for.js is saved to a hidden folder named .scripts in your projects root directory; then your scripts section of package.json will be defined as follows:

package.json

{
  ...
  "scripts": {
    "build-for": "node ./.scripts/build-for"
  },
  ...
}

Running the script

Invoke the npm script by running:

npm run build-for -- --prod

Note the special -- before the argument --prod must be included as explained here

As of [email protected], you can use custom arguments when executing scripts. The special option -- is used by getopt to delimit the end of the options. npm will pass all the arguments after the -- directly to your script:

Given the logic curently in the build-for.js - when no arguments are passed, for example:

npm run build-for

...the env flag will be set to --env=foo

Running the following:

npm run build-for -- --quux

...will result in the env flag will be set to --env=quux


Caveat

I haven't fully tested build-for.js, so you may find that you don't need to escape the double-quotes in this part '--base-href=\"/admin-v2/\"' of the following command (nodeCLI may handle that for you.):

// Run the ng build command
nodeCLI.exec('ng', 'build', '--output-path=../../web/admin-v2', env, '--base-href=\"/admin-v2/\"');
like image 162
RobC Avatar answered Dec 11 '25 22:12

RobC



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!