Обновление npm -g ничего не делает, хотя у меня устаревшие пакеты

Я запускаю npm версии 3.6.0 и node verison 5.6.0 в Windows 10:

> npm version
{ npm: '3.6.0',
  ares: '1.10.1-DEV',
  http_parser: '2.6.1',
  icu: '56.1',
  modules: '47',
  node: '5.6.0',
  openssl: '1.0.2f',
  uv: '1.8.0',
  v8: '4.6.85.31',
  zlib: '1.2.8' }
>

У меня есть несколько глобально установленных пакетов npm:

> npm ls -g --depth=0
C:\Users\Klas\AppData\Roaming\npm
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
`-- [email protected]

>

Если я запустил npm outdated -g, некоторые пакеты перечислены как устаревшие.

> npm outdated -g
Package      Current   Wanted   Latest  Location
jspm         0.16.25  0.16.25  0.16.29
live-server    0.9.0    0.9.0    0.9.2
protractor     3.0.0    3.0.0    3.1.1
tslint         3.2.2    3.2.2    3.4.0
webpack      1.12.11  1.12.11  1.12.13

Когда я запускаю npm update -g, он возвращается (через пару секунд) без предупреждения или сообщения об ошибке. Однако пакеты не обновлялись.

> npm update -g
>

Как я интерпретирую этот вопрос, npm update -g должен работать и должен обновлять глобальные пакеты верхнего уровня. Но, похоже, это не работает для меня.

Если я забегу (спасибо Бенджамину Кайзеру за подсказку):

> npm update -g --loglevel verbose

Я получаю много результатов. Это, по-видимому, наиболее актуально:

npm verb outdated not updating tslint because it currently at the maximum version 
that matches its specified semver range

Я до сих пор не совсем понимаю. Поскольку пакеты являются глобальными, нет заданного диапазона semver?

Выполнение обновления на конкретном пакете не помогает:

> npm update -g tslint
>

Даже указание версии не имеет никакого значения:

> npm update -g [email protected]
>

Но даже если бы это сработало, мне бы не пришлось явно обновлять каждый пакет. Для меня главной особенностью диспетчера пакетов должно быть упрощение обновления всего сразу.

Эта проблема звучит. Но когда я смотрю на модуль tslint npm, "последним" кажется 3.4.0. Итак, почему обновление не было?

Ответ 1

npm -g update имеет, довольно неожиданное поведение. Это может быть подходящим способом:

$ npm -g outdated --parseable=true | cut -d : -f 4 | xargs -n 1 npm -g install