NPM npm_package_main variable is always empty

Problem

NPM $npm_package_main variable is always empty.

  1. When I set the package.json file with "main": "index.js"
  2. Set the "start" property from scripts to "start": "node $npm_package_main"
  3. Then run npm start

Problem: the CLI executes the Node REPL mode, ignoring the "main" variable from package.json.

Expected behavior: execute the command as node index.js.

Environment

  • Linux Ubuntu 20.04.1
  • npm -v = 7.3.0
  • node -v = v15.5.0
  • npm run env | grep npm_package_name = npm_package_name=app
  • npm run env | grep npm_package_main = EMPTY

How to reproduce

  • Create an "app" directory and enter the new directory
  • Create an "index.js" file with the following content
    console.log('HELLO');
  • Run npm init and hit ENTER for all questions
  • Edit the package.json file and add the following line to the "scripts" property:
    "start": "node $npm_package_main",
  • now your package.json must look like this
    {
      "name": "app",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "devDependencies": {},
      "scripts": {
        "start": "node $npm_package_main",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
  • Run "npm start"
  • File "index.js" is not executed and Node enters the REPL mode.

Attempts

Set "start" and running "npm start" for:

  • "echo $npm_package_main" prints nothing
  • "echo $npm_package_name" prints "app"
  • "echo $npm_package_version" prints "1.0.0"

References

2 thoughts on “NPM npm_package_main variable is always empty”

Leave a Comment