¿Qué hace exactamente npm install --legacy-peer-deps? ¿Cuándo se recomienda? ¿Cuál es un posible caso de uso?
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-deps
pero 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 yarn
hasta hace muy poco y todo iba bien.
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-deps
ignora 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-deps
bandera 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: react
y 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 tree
error 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.
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.
legacy-peer-deps
:
- Predeterminado: falso
- Tipo: Booleano
Hace que npm lo ignore por completo
peerDependencies
al crear un árbol de paquetes, como en las versiones 3 a 6 de npm.Si un paquete no se puede instalar debido a
peerDependencies
una colisión demasiado estricta, proporciona una manera de avanzar para resolver la situación.Esto difiere de
--omit=peer
, en que--omit=peer
evitará descomprimirpeerDependencies
en el disco, pero aun así diseñará un árbol quepeerDependencies
pueda descomprimirse en el lugar correcto.No se recomienda el uso de
legacy-peer-deps
, ya que no hará cumplir elpeerDependencies
contrato en el que pueden confiar las metadependencias.
Si desea continuar usando legacy-peer-deps
sin 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
npmrc
archivos.El
npm config
comando se puede utilizar para actualizar y editar el contenido de los archivos npmrc globales y de usuario.