Install only one package from package.json?

As @atalantus noted in comment, the accepted answer doesn’t work on newer version of NPM. Working solution for newer versions (verified on NPM 6.13.4) is:

npm install --no-package-lock --no-save [email protected]

This will install bower and all its dependencies, but prevents installation of anything else you might have in package.json. It also doesn’t create or modify existing package-lock.json.

From npm documentation:

The --no-package-lock argument will prevent npm from creating a package-lock.json file. When running with package-lock’s disabled npm will not automatically prune your node modules when installing.

--no-save: Prevents saving to dependencies.

Combining this with Anton Rudeshko’s approach to find out version in package.json, the final solution is:

VERSION_BOWER=`node -p -e "require('./package.json').dependencies.bower"`
npm install --no-package-lock --no-save bower@"$VERSION_BOWER"

Update 2023

Alternative solution I’ve just used is to temporarily modify package.json to only keep the dependency you need. That can be done quite easily with help of jq

Given package.json

{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0",
    "foo": "^1.2.3",
    "bar": "^4.5.6",
  },
  "devDependencies": {
    "baz": "^10.20.30",
  }
}

Let’s first modify it with jq to only keep bower

cat package.json| jq 'del(.devDependencies) | .dependencies |= {bower:.bower}'

Gives us

{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0"
  }
}

by deleting devDependencies completely and leaving only bower in dependencies.

Next up you would want to overwrite package.json with this new, version, but you can’t do it directly like this

cat package.json | jq 'del(.devDependencies) | .dependencies |= {bower:.bower}' > package.json

because the file gets overwritten before it’s fully read. Instead you need to buffer the output stream of jq command, simplest solution just storing it in variable, and then overwriting the original file

updated=`cat package.json | jq 'del(.devDependencies) | .dependencies |= {bower:.bower}'`
echo $updated > package.json

And package.json now reads:

cat package.json
{
  "name": "sample",
  "main": "src/index.js",
  "dependencies": {
    "bower": "1.0.0"
  }
}

Run npm install now and you only install [email protected].

Obviously not always we can afford to modify the file, but you could also back-up the original file, etc. Main point is here how to easily modify json file thanks to jq rather than playing magic tricks with sed 🙂

Leave a Comment

File not found.