Npm проверить и обновить пакет, если это необходимо

471

Нам нужно интегрировать тестер Karma в TeamCity, и для этого я бы хотел написать небольшой скрипт для sys-инженеров (powershell или любой другой), который бы:

  1. выбрать нужный номер версии из какого-либо файла конфигурации (я думаю, я могу поместить его в качестве комментария прямо в karma.conf.js)

  2. проверить, установлена ​​ли определенная версия кармы-бегуна в глобальном репозитории npm

  3. если это не так, или установленная версия старше, чем нужно: выберите и установите нужную версию

  4. запустить его: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

Поэтому мой реальный вопрос: «Как проверить подлинность скрипта, если установлена ​​нужная версия пакета?». Вы должны сделать проверку, или это безопасно просто звонить npm -g installкаждый раз?

Я не хочу всегда проверять и устанавливать последнюю доступную версию, потому что другие значения конфигурации могут стать несовместимыми

iLemming
источник

Ответы:

609

Чтобы проверить, является ли какой-либо модуль в проекте «старым»:

npm outdated

' устаревший ' проверит каждый модуль, определенный в, package.jsonи посмотрит, есть ли более новая версия в реестре NPM.

Например, скажем xml2js 0.2.6node_modulesтекущем проекте) устарел, потому что существует более новая версия (0.2.7). Вы бы увидели:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Чтобы обновить все зависимости, если вы уверены, что это желательно:

npm update

Или, чтобы обновить одну зависимость, такую ​​как xml2js:

npm update xml2js
dublx
источник
6
Будьте осторожны, npm updateособенно с npm update -g... это не то, чего ожидает большинство людей! См: github.com/npm/npm/issues/6247 и gist.github.com/othiym23/4ac31155da23962afd0e
jbandi
6
@jbandi Начиная с npm@2.6.1, npm -g updateснова безопасно для использования. github.com/npm/npm/issues/6247#issuecomment-92182814
Чак Ле Батт,
7
Пожалуйста, имейте в виду, что npm update не будет обновлять ваш файл package.json, как указано в ответе @Erik Olson.
Этешам Хасан
5
As of npm@5.0.0, 'npm update' will change package.json to save the new version as the minimum required dependency docs.npmjs.com/cli/update.html
Сидни
368

npm outdatedопределит пакеты, которые следует обновить, и npm update <package name>которые можно использовать для обновления каждого пакета. Но до npm@5.0.0 npm update <package name>не будет обновлять версии в вашем package.json, что является проблемой.

Лучший рабочий процесс заключается в:

  1. Определить устаревшие пакеты
  2. Обновите версии в вашем package.json
  3. Запустите npm updateдля установки последних версий каждого пакета

Проверьте, npm-check-updatesчтобы помочь с этим рабочим процессом.

  • Установите npm-check-updates
  • Запустите, npm-check-updatesчтобы увидеть, какие пакеты устарели (в основном то же самое, что и запуск npm outdated)
  • Запустите, npm-check-updates -uчтобы обновить все версии в вашем package.json (это волшебный соус)
  • Запустите npm updateкак обычно, чтобы установить новые версии ваших пакетов на основе обновленного package.json
Эрик Олсон
источник
3
npm outdatedпокажет ВСЕ пакеты ... даже внутри других пакетов ... но они не будут обновлены с помощью этой процедуры, поэтому они всегда будут появляться ... так что просто используйте npm-check-updates(как вы на самом деле рекомендовали), который показывает только основные пакеты из package.json... это актуально
Давидхк
С пряжей это намного проще, просто наберите «обновление пряжи».
Кристофер Григг
17
Почему я должен установить менеджер обновлений для управления моим менеджером пакетов? Разве мы не согласны, что это глупо? Это должно быть так просто, npm install --all-outdatedно это не так ...
ADJenks
3
Вы всегда можете запустить, npm update --save package_nameчтобы сохранить последние изменения в package.json.
trungk18
Эрик, не могли бы вы ответить на этот связанный с этим вопрос , потому что меня все еще немного смущает разница между обеими командами, то есть npm updateпротив npm-check-updates?
Жоао Пиментел Феррейра
146

Существует также «свежий» модуль под названием npm-check:

NPM-проверка

Проверьте устаревшие, неправильные и неиспользованные зависимости.

введите описание изображения здесь

Он также предоставляет удобный интерактивный способ обновления зависимостей.

alecxe
источник
78

Один простой шаг:

$ npm i -g npm-check-updates && ncu -u && npm i

Это все. Все версии пакета package.jsonбудут последними основными версиями.

Редактировать:

Что здесь происходит?

  1. Установка пакета, который проверяет обновления для вас.

  2. Используйте этот пакет, чтобы обновить все версии пакета в вашем package.json(-u - сокращение от --updateAll).

  3. Установите все новые версии пакетов.

Matt
источник
3
@imnickvaughn ncuрасшифровывается как node-check-updates и -aявляется опцией upgradeAll. Найдите все варианты здесь: npmjs.com/package/npm-check-updates
Ариан Акоста,
А что, если я хочу сделать это в одной строке, не используя другой пакет, такой как ncu?
ADJenks
Или без глобальной установки,npx -p npm-check-updates ncu -u
entozoon
68
  • Чтобы обновить один локальный пакет:

    1. Сначала узнайте ваши устаревшие пакеты:

      npm outdated

    2. Затем обновите пакет или пакеты, которые вы хотите вручную, как:

      npm update --save package_name

Таким образом, нет необходимости обновлять локальный package.json файл.

Обратите внимание, что это обновит ваш пакет до последней версии.

  • Если вы пишете какую-то версию в вашем package.jsonфайле и делаете:

    npm update package_name

    В этом случае вы получите только следующую стабильную версию (требуемую) относительно версии, которую вы написали в своем package.jsonфайле.

А с ним npm list (package_name)вы можете узнать текущую версию ваших локальных пакетов.

часовщик
источник
14

Команды NPM для обновления или исправления уязвимостей в некоторых файлах манифеста зависимости

  • Используйте приведенную ниже команду для проверки устаревших или уязвимостей в ваших модулях узла.

    npm audit

  • Если обнаружены какие-либо уязвимости, используйте приведенную ниже команду, чтобы исправить все проблемы.

    npm audit fix

  • Если это не работает для вас, попробуйте

    npm audit fix -fэта команда почти исправит все уязвимости. Некоторые зависимости или devDependencies заблокированы в файле package-lock.json , поэтому мы используем -fфлаг для принудительного их обновления.

  • Если вы не хотите использовать принудительное исправление аудита, вы можете вручную исправить версии зависимостей, изменив их в файлах package-lock.json и package.json . Тогда беги

npm update && npm upgrade

Смит Патель
источник
10

Никаких дополнительных пакетов, чтобы просто проверить устаревшие и обновить те, которые есть, эта команда сделает:

npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)

MikeMajara
источник
Хороший человек, спасибо!
DrKreso
Это отличный ответ, потому что его можно вставить в любой скрипт оболочки, чтобы автоматизировать этот шаг, не полагаясь на установку какого-либо дополнительного пакета.
Jankapunkt
4

При установке пакетов npm (глобально или локально) вы можете определить конкретную версию, используя @versionсинтаксис для определения версии, которая будет установлена.

Другими словами, выполнение: npm install -g karma@0.9.2 гарантирует, что установлен только 0.9.2, и не будет переустанавливаться, если оно уже существует.

В качестве совета я бы рекомендовал избегать глобальных установок npm везде, где вы можете. Многие люди не понимают, что если зависимость определяет файл bin, он устанавливается в ./node_modules/.bin/. Часто очень просто использовать ту локальную версию установленного модуля, которая определена в вашем package.json. Фактически, сценарии npm добавят ./node_modules/.bin на ваш путь.

В качестве примера, вот package.json, который при запуске npm install && npm testустановит версию karma, определенную в моем package.json, и будет использовать эту версию karma (установленную в node_modules / .bin / karma) при запуске testсценария:

{
 "name": "myApp",
 "main": "app.js",
 "scripts": {
   "test": "karma test/*",
 },
 "dependencies": {...},
 "devDependencies": {
   "karma": "0.9.2"
 }
}

Это дает вам преимущество вашего package.json, определяющего используемую версию кармы, и не требует сохранения этой конфигурации глобально на вашем CI box.

addisonj
источник
что в testсценарии? Подскажите, пожалуйста, как вы устанавливаете его с помощью скрипта.
iLemming
1
Посмотрите на package.json. В свойстве «scripts» вы можете определить другое свойство «test», значением которого является команда, которую вы хотите запустить при вводе npm test. Документы по npm здесь довольно хороши: npmjs.org/doc/scripts.html
addisonj
4

Начиная с npm@5.0.0+ вы можете просто сделать:

npm update <package name>

Это автоматически обновит package.jsonфайл. Нам не нужно обновлять последнюю версию вручную, а затем использоватьnpm update <package name>

Вы все еще можете получить старое поведение, используя

npm update --no-save

( Ссылка )

Adiga
источник
1

Чтобы действительно обновить только один пакет, установите NCU, а затем запустите его только для этого пакета. Это столкнется с реальным последним.

npm install -g npm-check-updates

ncu -f your-intended-package-name -u
regisbsb
источник
6
Сообщение низкого качества, некоторые лучшие объяснения помогут.
linuxfan говорит восстановить Monica