Skip to content

Instantly share code, notes, and snippets.

@othiym23
Created September 20, 2014 19:36
Show Gist options
  • Save othiym23/4ac31155da23962afd0e to your computer and use it in GitHub Desktop.
Save othiym23/4ac31155da23962afd0e to your computer and use it in GitHub Desktop.
a safe way to upgrade all of your globally-installed npm packages
#!/bin/sh
set -e
set -x
for package in $(npm -g outdated --parseable --depth=0 | cut -d: -f3)
do
npm -g install "$package"
done
#!/bin/sh
set -e
set -x
for package in $(npm -g outdated --parseable --depth=0 | cut -d: -f2)
do
npm -g install "$package"
done
@iki
Copy link

iki commented Nov 10, 2014

@othiym23: I needed to add -q to npm options to reset the loglevel to warn, so that http level msgs are not in the output ... this is generally good practice, as different people can have different default loglevel set in their .npmrc

@sonarxavier
Copy link

Thanks for the npm-check util update!

@curtisalexander
Copy link

This caused me a lot of heartburn...hope it helps others who find the thread.

The --parseable flag changes the order of the output from npm outdated without the flag.

npm outdated -g --depth=0 produces output according to the header → current | wanted | latest
npm outdated -g --depth=0 --parseable produces output in a different order → wanted | current | latest

# current
npm outdated <package> -g --depth=0 --parseable | cut -d: -f3

# wanted 
npm outdated <package> -g --depth=0 --parseable | cut -d: -f2

# latest
npm outdated <package> -g --depth=0 --parseable | cut -d: -f4

@jasonkarns
Copy link

@jsonkarns: if you don't have /bin/sh, you don't have UNIX.

@othiym23 I don't follow. The env isn't to guard against not having sh. It's to ensure that these scripts run against the user's preferred sh executable. For example, running against a homebrew-built sh instead of old system install. Since these scripts are intended to be used directly by the user (and not automated or as part of a utility), then they should be run against the user's chosen executable.

@steventhomson
Copy link

FYI: npm @2.6.1+ does not recursively update dependencies by default anymore.
https://docs.npmjs.com/cli/update

@leompeters
Copy link

+1 @dylang , thanks bro!!!

@martisj
Copy link

martisj commented Sep 18, 2016

+1 @dylang npm-check for president!

@edoardoc
Copy link

edoardoc commented Jan 9, 2017

+1 @dylang npm-check

@finalbytes
Copy link

+1 @dylang npm-check

@agalazis
Copy link

+1 for npm-check

@hoanganh25991
Copy link

hoanganh25991 commented Feb 3, 2017

+1 for npm-check
should have emotion for answer in gist, which easy to rise a thumbsub on @dylang's anwser

@gbarkhatov
Copy link

+1 @dylang npm-check

@xgvargas
Copy link

If you have linked some personal package to global then you should use:

#!/bin/sh
set -e
set -x
for package in $(npm -g outdated --parseable --depth=0 | grep -v @linked | cut -d: -f2)
do
    npm -g install "$package"
done

As this will not try to update your local linked package. Actually this should be the default case since it works even when you don't have linked packages.

@xgvargas
Copy link

I love npm-check too, but my poor man hardware with low memory hates it. So I have developed a very simple package to list outdated packages, install selected ones and update my package.json rules. It will not check for unused or missing packages like npm-check does. But will work with global packages too, and my machine likes it... If you want to take a look: atualiza.

@callemo
Copy link

callemo commented Apr 21, 2017

This one-liner made the trick for me: npm -gp outdated | cut -d: -f4 | xargs -n1 npm -g install

@Noyabronok
Copy link

the one liner updated npm for me :(

@hrushikesh09
Copy link

+1 @dylan
npm -g i npm-check

@calpa
Copy link

calpa commented Aug 6, 2017

+1 @dylang npm-check

@jan-hudec
Copy link

jan-hudec commented Aug 14, 2017

npm outdated -g seems to have stopped working too. Does not print anything at all here though there definitely are outdated packages.

@Jeff-Lewis
Copy link

npm outdated -g was fixed a while back and works with npm version 6.4.1.

@akaleeroy
Copy link

Running npm v6.8.0 and seeing this problem again. Global packages won't update beyond "wanted".

> npm outdated --global
Package        Current  Wanted  Latest  Location
color-convert    1.9.3   1.9.3   2.0.0
mocha            5.2.0   5.2.0   6.0.0
pdfkit           0.8.3   0.8.3   0.9.0

> npm update --global pdfkit
# does nothing

> npm update --global pdfkit@latest
# does nothing

> npm install --global pdfkit
+ pdfkit@0.9.0
added 8 packages from 41 contributors and updated 22 packages in 9.638s

@KlausEverWalkingDev
Copy link

If you prefer to choose which global modules are updated I've added interactive updating to npm-check with support for global.

It also includes links to the source for each updated package so you can find out what's new.

Behind the scenes npm-check uses npm install thanks to the recommendation from @othiym23 in this thread.

# install
npm -g i npm-check

# interactive update of global packages
npm-check -u -g

# interactive update for a project you are working on
npm-check -u

Example using npm-check -u:
screen shot 2014-10-20 at 10 39 29 am

Source: github.com/dylang/npm-check

Great, bro! Thanks! :D

@martin-braun
Copy link

The Wanted version shall be another major version, which is not very favorable, since it can break things.

Here is a way to upgrade only minor versions of global packages:

npm_global_packages=($(npm list -g --depth 0 | awk '/ /{print $2}'))
for val in "${npm_global_packages[@]}"; do
    npm i -g --force $(echo $val | tr "." "\n" | head -1)
done

more context

Good part is, that it will not bump npm to a version that is incompatible with the current node version, so this will most likely not break.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment