¿Cómo anulo las versiones de dependencia NPM anidadas?

290

Me gustaría usar el grunt-contrib-jasminepaquete NPM. Tiene varias dependencias. Parte del gráfico de dependencia se ve así:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

Desafortunadamente, hay un error en esta versión phantomjsque impide que se instale correctamente en Mac OS X. Esto se solucionó en la última versión.

¿Cómo puedo grunt-lib-phantomjsusar una versión más nueva de phantomjs?

Algún contexto adicional:

georgebrock
fuente
Solo git cloneo tenedor requerido módulo. También puede eliminar anidados phantomjsmanualmente.
Aleksei Zabrodskii
3
grunt-contrib-jasmineestá en 0.5.1, que usa [email protected], que usa [email protected]:)
gustavohenke

Respuestas:

238

Puede usar la funcionalidad npm shrinkwrap para anular cualquier dependencia o subdependencia .

Acabo de hacer esto en un proyecto nuestro. Necesitábamos una versión más nueva de connect, desde 2.7.3. nos estaba causando problemas. Entonces creé un archivo llamado npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm debería recogerlo automáticamente mientras realiza la instalación del proyecto.

(Ver: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )

esmoquin
fuente
77
Cuando hago esto, solo grunt-contrib-connectse instalan la dependencia y sus hijos. Todas mis otras dependencias en package.json no están instaladas.
iDVB
55
Tuve el mismo problema que @iDVB. Terminé editando el node_modulesdirectorio para que el volcado de dependencia de envoltura retráctil completa fuera exactamente lo que quería, no solo anulaciones. Pero sigue siendo una especie de solución dolorosa.
Kobold
2
@Domi, este archivo se crea ejecutando npm shrinkwrap, las entradas no se agregan a mano
glasspill
13
Desafortunadamente, como se menciona en ese error, con npm4, el enfoque minimalista ya no funciona. (Al eliminar node_modules, ejecutar una instalación con un encogimiento mínimo parece dejar devDependenciesintacto aunque se ignore dependencies, pero ejecutar otra instalación elimina los elementos no explícitos, por lo que por ahora es importante ejecutar npm shrinkwrappara obtener un archivo completo, modificar la parte en cuestión y luego corre de npm installnuevo)
Brett Zamir
66
npm 6.4 simplemente sobrescribirá el archivo retráctil y usará las dependencias desactualizadas
ShadSterling
83

Para aquellos de 2018 y más allá, usando npm versión 5 o posterior: edite su package-lock.json: elimine la biblioteca de la "requires"sección y agréguela en "dependencias".

Por ejemplo, desea que el deglobpaquete use la globversión del paquete en 3.2.11lugar de la actual. Abres package-lock.jsony ves:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Eliminar "glob": "7.1.2",de "requires", agregar "dependencies"con la versión adecuada:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Ahora elimine su node_modulescarpeta, ejecute npm instally agregará partes faltantes a la "dependencies"sección.

izogfif
fuente
44
Esto es bueno, siempre y cuando se npm installejecute una vez. En mi caso, las ediciones son necesarias ya que el dep anidado está causando un error.
ppasler
59
esto se eliminará cada vez que ejecute en npm ilugar de editar su package-lock.json y agregar la dependencia secundaria a las "dependencias", agregue la dependencia secundaria a la sección "dependencias" de package.json
trickpatty
66
He creado una biblioteca que hace exactamente eso por usted automáticamente: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves
14
Funciona, pero luego, si ejecuto npm installnuevamente, todos los cambios package-lock.jsonse revierten y obtengo la versión incorrecta del dep.
2rs2ts
14
Corro npm ciy esto no toca elpackage-lock.json
sschoof
0

Tuve un problema en el que una de las dependencias anidadas tenía una vulnerabilidad de auditoría npm, pero aún quería mantener la versión de dependencia principal. la solución npm shrinkwrap no funcionó para mí, así que lo que hice para anular la versión de dependencia anidada:

  1. Elimine la dependencia anidada en la sección 'requiere' en package-lock.json
  2. Agregue la dependencia actualizada en DevDependencies en package.json, para que los módulos que lo requieran aún puedan acceder a ella.
  3. npm i
Ethan Yang
fuente
-1

NPM shrinkwrap ofrece una buena solución a este problema. Nos permite anular esa versión de una dependencia particular de un submódulo particular.

Esencialmente, cuando ejecuta npm install, npm primero buscará en su directorio raíz para ver si existe un archivo npm-shrinkwrap.json. Si lo hace, usará esto primero para determinar las dependencias del paquete y luego volverá al proceso normal de trabajar a través de los archivos package.json.

Para crear un npm-shrinkwrap.json, todo lo que necesitas hacer es

 npm shrinkwrap --dev

código:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}
Murtaza Hussain
fuente
3
¿Es esto diferente de la respuesta actualmente aceptada? Esa respuesta tiene dos comentarios votados que sugieren que las versiones más nuevas de npm requieren pasos manuales adicionales o hacen cosas indeseables con esta solución. No es ese el caso?
Fabio Beltramini
-1

Encontré una solución que funcionó para mí.

Entonces. Primero edite su archivo npm-shrinkwrap.json como recomienda todas las demás soluciones.

Entonces, (en Windows):

  • Haga clic derecho en el archivo 'npm-shrinkwrap.json'
  • Propiedades
  • En Atributos, seleccione 'Solo lectura'. Esto evitará que npm modifique el archivo mpn-shrinkwrap.json.

Las otras soluciones propuestas son lo suficientemente buenas si realiza la operación 'npm install' solo una vez. Pero después de la primera 'instalación de npm', el archivo 'npm-shrinkwrap.json' se modifica nuevamente como antes de su modificación.

Shlomo Sfez
fuente
-1: esto requeriría que desbloquee el archivo nuevamente cada vez que desee realizar cambios. En esos casos, perdería las ediciones manuales en el archivo retráctil de todos modos. Además, cualquiera que colabore en su código también debe habilitar este truco.
thomaux