¿Qué hace exactamente npm install --legacy-peer-deps? ¿Cuándo se recomienda? ¿Cuál es un posible caso de uso?

Resuelto antonwilhelm asked hace 3 años • 9 respuestas

Me encontré con este error:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: nexttwin@0.1.0
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR!   react@"17.0.1" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0" from react-hook-mousetrap@2.0.4
npm ERR! node_modules/react-hook-mousetrap
npm ERR!   react-hook-mousetrap@"*" from the root project
npm ERR! 

El módulo que estoy intentando instalar parece tener una dependencia de pares diferente a la que instalé. Parece que npm cambió su comportamiento a este respecto y ahora permite que falle la instalación.

¿Qué puedo hacer ahora para solucionar este problema? No quiero degradar mi versión de React por esto.

Sé que hay una bandera llamada --legacy-peer-depspero no estoy seguro de qué hace exactamente y si se recomienda usarla/cuáles son las posibles desventajas. Supongo que hay una razón por la que npm permitió que fallara la instalación.

Es simplemente extraño porque estuve consumiendo yarnhasta hace muy poco y todo iba bien.

antonwilhelm avatar Feb 17 '21 17:02 antonwilhelm
Aceptado

TL;DR:

  • NPM v7+ instala peerDependencies de forma predeterminada ; este no es el caso de las versiones anteriores de NPM.
  • Los módulos NPM deben nombrar versiones específicas de sus peerDependencies
  • Si ya tiene instalada una peerDependency, pero no con una versión nombrada por el módulo, entonces NPM v7+ arrojará un error
  • Agregar --legacy-peer-depsignora este nuevo requisito, a riesgo de introducir cambios importantes

--legacy-peer-deps restaura el comportamiento de instalación de peerDependency desde NPM v4 hasta v6

Una forma de pensar en esta bandera es que no está haciendo algo nuevo; más bien le está diciendo a NPM que no haga algo nuevo, ya que NPM v7 ahora instala peerDependencies de forma predeterminada .

En muchos casos, esto genera conflictos de versiones, lo que interrumpirá el proceso de instalación.

La --legacy-peer-depsbandera se introdujo con la versión 7 como una forma de evitar la instalación automática de peerDependency; le dice a NPM que ignore los departamentos de pares y continúe con la instalación de todos modos. Así solían ser las cosas con NPM v4 a v6.

Si no tiene clara la diferencia entre departamentos regulares y departamentos de pares, aquí tiene un poco de contexto:

Dependencias vs peerDependencies

Dependencias: Bibliotecas o módulos que un módulo NPM necesita para funcionar en producción . (Ejemplo: recientemente construí una biblioteca simulada de gráficos circulares que usa Chance.js para calcular números aleatorios dentro de un rango específico; por lo tanto, Chance es una dependencia de mi módulo).

peerDependencies : una dependencia de pares es una versión específica o un conjunto de versiones de una biblioteca de software de terceros con la que un módulo está diseñado para funcionar . Son similares en concepto a la relación entre una extensión de navegador y un navegador. (Ejemplo: reaccionar-redux tiene dos peerDependencies bastante lógicas: reacty redux.)

Este problema se debe, en parte, a React v17+

Debido a la gran cantidad de módulos que no han agregado específicamente React v17 (o más recientemente, React 18) como peerDependency, ahora es común encontrar el unable to resolve dependency treeerror al ejecutar instalaciones de npm dentro de una aplicación React v17.

Este error se activará cada vez que un módulo (o cualquiera de sus propias dependencias) incluya una versión principal anterior de React como peerDependency sin incluir específicamente React v17 también.

( Nota: se producirá un comportamiento similar con la actualización de la versión principal de cualquier otro marco o biblioteca).

Cómo verificar las dependencias de pares para cualquier módulo determinado

NPM en sí no enumera los departamentos de pares en las páginas de un módulo determinado. Sin embargo, existe una solución alternativa sencilla para comprobar si hay departamentos de pares, ya sea antes o después de la instalación. Simplemente ejecuta:

npm info name-of-module peerDependencies

Este comando devolverá el nombre de cada peerDependency junto con todas las versiones compatibles.

Chris Perry avatar Mar 14 '2021 03:03 Chris Perry

Así es como resolví este problema:

Primero, qué está pasando: react-hook-mousetrap busca [email protected] , pero no lo encuentra. En lugar de eso, busca @react17.0.1, que es una versión más nueva. Por alguna razón, a Mousetrap no le gusta esta versión más nueva y se le está notificando (no es gran cosa, pero decidieron que valía la pena detener la compilación).

Una solución: instalar a la fuerza la versión específica de reaccionar que quiere mousetrap:

yarn add react@16.8.0

Lo que esto hace es revertir su versión de reacción a una un poco más antigua que sea compatible con mousetrap. No notarás ninguna diferencia y, en futuras iteraciones, es de esperar que se actualice mousetrap para que esto desaparezca.

Otra solución: tome la decisión radical de no instalar ninguna dependencia de versión anterior:

npm add xxxx --legacy-peer-deps

Lo que esto hace es ignorar las dependencias antiguas de este paquete. Es más completo y toma muchas decisiones por usted.

Izzi avatar Feb 24 '2021 08:02 Izzi

legacy-peer-deps:

  • Predeterminado: falso
  • Tipo: Booleano

Hace que npm lo ignore por completo peerDependenciesal crear un árbol de paquetes, como en las versiones 3 a 6 de npm.

Si un paquete no se puede instalar debido a peerDependenciesuna colisión demasiado estricta, proporciona una manera de avanzar para resolver la situación.

Esto difiere de --omit=peer, en que --omit=peerevitará descomprimir peerDependenciesen el disco, pero aun así diseñará un árbol que peerDependenciespueda descomprimirse en el lugar correcto.

No se recomienda el uso de legacy-peer-deps, ya que no hará cumplir el peerDependenciescontrato en el que pueden confiar las metadependencias.


Si desea continuar usando legacy-peer-depssin necesidad de agregar la bandera a cada comando, puede configurarlo en su .npmrc(ya sea a nivel de proyecto o globalmente en su máquina):

echo "legacy-peer-deps=true" >> .npmrc

npmrc :

npm obtiene sus configuraciones de la línea de comando, variables de entorno y npmrcarchivos.

El npm configcomando se puede utilizar para actualizar y editar el contenido de los archivos npmrc globales y de usuario.

JBallin avatar Jan 18 '2023 15:01 JBallin