npm verifique y actualice el paquete si es necesario

471

Necesitamos integrar el corredor de prueba de Karma en TeamCity y para eso me gustaría dar un pequeño script a los ingenieros del sistema (powershell o lo que sea) que:

  1. recoger el número de versión deseado de algún archivo de configuración (supongo que puedo ponerlo como comentario directamente en el karma.conf.js)

  2. compruebe si la versión definida de karma runner está instalada en el repositorio global de npm

  3. si no lo es, o la versión instalada es anterior a la deseada: seleccione e instale la versión correcta

  4. ejecutarlo: karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

Entonces, mi verdadera pregunta es: "¿cómo se puede registrar un script, si está instalada la versión deseada del paquete?". ¿Debería hacer la verificación, o es seguro simplemente llamar npm -g installcada vez?

No quiero verificar e instalar siempre la última versión disponible, porque otros valores de configuración pueden volverse incompatibles

iLemming
fuente

Respuestas:

609

Para verificar si algún módulo en un proyecto es 'viejo':

npm outdated

' desactualizado ' verificará cada módulo definido en package.jsony verá si hay una versión más nueva en el registro NPM.

Por ejemplo, digamos xml2js 0.2.6(ubicado en node_modulesel proyecto actual) está desactualizado porque existe una versión más nueva (0.2.7). Tu verias:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

Para actualizar todas las dependencias, si está seguro de que es conveniente:

npm update

O, para actualizar una dependencia única como xml2js:

npm update xml2js
dublx
fuente
66
Tenga cuidado npm updateespecialmente con npm update -g... ¡no es lo que la mayoría de las personas esperan que haga! Ver: github.com/npm/npm/issues/6247 y gist.github.com/othiym23/4ac31155da23962afd0e
jbandi
66
@jbandi A partir de [email protected], npm -g updatees seguro volver a usarlo. github.com/npm/npm/issues/6247#issuecomment-92182814
Chuck Le Butt el
77
Tenga en cuenta que la actualización de npm no actualizará su archivo package.json como se indica en la respuesta de @Erik Olson.
Ehtesham Hasan
55
As of [email protected], 'npm update' will change package.json to save the new version as the minimum required dependency docs.npmjs.com/cli/update.html
Sidney el
368

npm outdatedidentificará los paquetes que deben actualizarse y npm update <package name>se pueden usar para actualizar cada paquete. Pero antes de [email protected], npm update <package name>no actualizará las versiones en su package.json, lo cual es un problema.

El mejor flujo de trabajo es:

  1. Identificar paquetes desactualizados
  2. Actualice las versiones en su package.json
  3. Ejecute npm updatepara instalar las últimas versiones de cada paquete

Echa un vistazo npm-check-updatespara ayudar con este flujo de trabajo.

  • Instalar npm-check-updates
  • Ejecutar npm-check-updatespara enumerar qué paquetes están desactualizados (básicamente lo mismo que ejecutar npm outdated)
  • Ejecute npm-check-updates -upara actualizar todas las versiones en su package.json (esta es la salsa mágica)
  • Ejecute npm updatecomo de costumbre para instalar las nuevas versiones de sus paquetes basadas en el paquete actualizado json
Erik Olson
fuente
3
npm outdatedmostrará TODOS los paquetes ... incluso dentro de otros paquetes ... pero esos no se actualizarán con este procedimiento, por lo que siempre aparecerán ... así que solo use npm-check-updates(como realmente lo recomendó) que solo muestra los paquetes principales de package.json... esto es relevante
davidhq
Con hilo, esto es mucho más fácil simplemente escriba 'actualización de hilo'.
Christopher Grigg
17
¿Por qué debo instalar un administrador de actualizaciones para administrar mi administrador de paquetes? ¿No estamos de acuerdo en que esto sea una tontería? Debería ser tan simple como npm install --all-outdatedpero no lo es ...
ADJenks
3
Siempre puede ejecutar npm update --save package_namepara guardar el último cambio en package.json.
trungk18
Erik, ¿puedes responder amablemente esta pregunta SO relacionada , porque todavía es un poco confuso para mí la diferencia entre ambos comandos, es decir, npm updatevs npm-check-updates?
João Pimentel Ferreira
146

También hay un módulo "nuevo" llamado npm-check:

npm-check

Verifique las dependencias desactualizadas, incorrectas y no utilizadas.

ingrese la descripción de la imagen aquí

También proporciona una forma interactiva conveniente de actualizar las dependencias.

alecxe
fuente
78

Un paso fácil:

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

Eso es todo. Todas las versiones del paquete package.jsonserán las últimas versiones principales.

Editar:

¿Que está sucediendo aquí?

  1. Instalar un paquete que verifica las actualizaciones por usted.

  2. Use este paquete para actualizar todas las versiones del paquete en su package.json(-u es la abreviatura de --updateAll).

  3. Instale todas las nuevas versiones de los paquetes.

Mate
fuente
3
@imnickvaughn son las ncusiglas de node-check-updates y -aes la opción 'upgradeAll'. Encuentre todas las opciones aquí: npmjs.com/package/npm-check-updates
Arian Acosta
¿Y qué pasa si quiero hacerlo en una línea sin usar otro paquete como ncu?
ADJenks
O sin instalar el mundial,npx -p npm-check-updates ncu -u
entozoon
68
  • Para actualizar un solo paquete local:

    1. Primero descubra sus paquetes obsoletos:

      npm outdated

    2. Luego actualice el paquete o paquetes que desee manualmente como:

      npm update --save package_name

De esta manera, no es necesario actualizar su package.json archivo local .

Tenga en cuenta que esto actualizará su paquete a la última versión.

  • Si escribe alguna versión en su package.jsonarchivo y hace:

    npm update package_name

    En este caso, obtendrá la próxima versión estable (deseada) con respecto a la versión que escribió en su package.jsonarchivo.

Y con npm list (package_name)usted puede averiguar la versión actual de sus paquetes locales.

Relojero
fuente
14

Comandos NPM para actualizar o corregir vulnerabilidades en algunos archivos de manifiesto de dependencia

  • Utilice el siguiente comando para verificar las vulnerabilidades o las versiones obsoletas en sus módulos de nodo.

    npm audit

  • Si se encuentran vulnerabilidades, utilice el siguiente comando para solucionar todos los problemas.

    npm audit fix

  • Si no funciona para usted, intente

    npm audit fix -f, este comando casi arreglará todas las vulnerabilidades. Algunas dependencias o devDependencies están bloqueadas en el archivo package-lock.json , por lo que usamos -fflag para forzar la actualización.

  • Si no desea utilizar la corrección de auditoría forzada, puede corregir manualmente las versiones de sus dependencias cambiándolas en el archivo package-lock.json y package.json . Entonces corre

npm update && npm upgrade

Smit Patel
fuente
10

Sin paquetes adicionales, para verificar si están desactualizados y actualizar los que están, este comando hará:

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

MikeMajara
fuente
Buenas cosas hombre, gracias!
drKreso
Esta es una gran respuesta porque se puede poner en cualquier script de shell para automatizar este paso sin depender de tener instalado ningún paquete adicional.
Jankapunkt
4

Al instalar paquetes npm (tanto global como localmente), puede definir una versión específica mediante el uso de la @versionsintaxis para definir la versión que se instalará.

En otras palabras, hacer: npm install -g [email protected] asegurará que solo 0.9.2 esté instalado y no se reinstalará si ya existe.

Como consejo, sugeriría evitar las instalaciones globales de npm siempre que pueda. Muchas personas no se dan cuenta de que si una dependencia define un archivo bin, se instala en ./node_modules/.bin/. A menudo, es muy fácil de usar esa versión local de un módulo instalado que se define en su package.json. De hecho, los scripts npm agregarán ./node_modules/.bin a su ruta.

Como ejemplo, aquí hay un package.json que, cuando ejecuto npm install && npm test, instalará la versión de karma definida en mi package.json, y usaré esa versión de karma (instalada en node_modules / .bin / karma) cuando ejecute el testscript:

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

Esto le brinda el beneficio de su package.json que define la versión de karma a usar y no tiene que mantener esa configuración globalmente en su caja CI.

addisonj
fuente
¿Qué hay en el testguión? ¿Puede darme una idea de cómo lo instala con un script?
iLemming
1
Mira el paquete.json. Debajo de la propiedad "scripts", puede definir otra propiedad, "test" cuyo valor es un comando que desea ejecutar cuando escribe npm test. Los documentos de npm son bastante buenos aquí: npmjs.org/doc/scripts.html
addisonj
4

A partir de [email protected]+ simplemente puede hacer:

npm update <package name>

Esto actualizará automáticamente el package.jsonarchivo. No tenemos que actualizar la última versión manualmente y luego usarnpm update <package name>

Todavía puede obtener el comportamiento anterior usando

npm update --no-save

( Referencia )

adiga
fuente
1

Para actualizar realmente solo un paquete, instale NCU y luego ejecútelo solo para ese paquete. Esto se topará con lo último real.

npm install -g npm-check-updates

ncu -f your-intended-package-name -u
regisbsb
fuente
66
Publicación de baja calidad, una mejor explicación ayudaría.
linuxfan dice Reinstate Monica