Soy nuevo en npm y estoy tratando de entender cómo funciona la recreación del directorio node_modules para la implementación.
Usamos npm ci en lugar de npm install para garantizar un borrón y cuenta nueva durante la implementación. Sin embargo, cuando lo ejecutamos sin banderas, obtenemos el siguiente error:
Solucione el conflicto de dependencia ascendente o vuelva a intentar este comando con --force o --legacy-peer-deps para aceptar una resolución de dependencia incorrecta (y potencialmente rota).
La documentación para npm install para --force es la siguiente (no hay indicadores en la página de npm ci ):
El argumento -f o --force obligará a npm a obtener recursos remotos incluso si existe una copia local en el disco.
Mientras tanto, la documentación para --legacy-peer-deps dice:
--legacy-peer-deps: ignora todas las dependencias de los pares al instalar, al estilo de las versiones 4 a 6 de npm.
Parece que ambas banderas permitirán que npm ci genere el directorio node_modules sin ningún problema, pero aún no tengo claras las diferencias entre los dos.
Por lo que entiendo, --force parece que será sobre la base de que la última dependencia descargada gana y sobrescribirá cualquier dependencia descargada previamente. Mientras tanto, --legacy-peer-deps siempre omitirá las dependencias de pares (cualesquiera que sean) durante la instalación, incluso si no hay problemas.
¿Cuáles son las diferencias entre las dos banderas y cuándo debemos usarlas?
En la nueva versión de npm (v7), de forma predeterminada, npm install fallará cuando encuentre dependencias entre pares en conflicto. Antes no era así.
Eche un vistazo aquí para obtener más información sobre las dependencias entre pares en npm v7.
Las diferencias entre los dos están a continuación:
--legacy-peer-deps : ignore todas las dependencias de los pares al instalar, al estilo de las versiones 4 a 6 de npm.
--strict-peer-deps : falla y aborta el proceso de instalación para cualquier peerDependencies en conflicto cuando se encuentre. De forma predeterminada, npm solo fallará en caso de conflictos de peerDependencies provocados por las dependencias directas del proyecto raíz.
En el artículo de https://github.blog/2021-02-02-npm-7-is-now-generally-disponible/
Tiene la opción de volver a intentarlo con
--forcepara omitir el conflicto o--legacy-peer-depspara ignorar por completo las dependencias entre pares (este comportamiento es similar a las versiones 4-6).
Estoy de acuerdo en que esta oración no es muy clara, pero "ignorar por completo las dependencias entre pares" no suena bien. Usemos un ejemplo real:
Aquí hay un error de dependencia de pares que encontré cuando npm install :
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: mobile@undefined npm ERR! Found: react@17.0.1 npm ERR! node_modules/react npm ERR! react@"17.0.1" from the root project npm ERR! peer react@">=16.0.0" from @testing-library/react-native@7.2.0 npm ERR! node_modules/@testing-library/react-native npm ERR! dev @testing-library/react-native@"7.2.0" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer react@"16.13.1" from react-native@0.63.2 npm ERR! node_modules/react-native npm ERR! react-native@"https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz" from the root project npm ERR! peer react-native@">=0.59" from @testing-library/react-native@7.2.0 npm ERR! node_modules/@testing-library/react-native npm ERR! dev @testing-library/react-native@"7.2.0" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. npm ERR! npm ERR! See /Users/me/.npm/eresolve-report.txt for a full report. npm ERR! A complete log of this run can be found in: npm ERR! /Users/me/.npm/_logs/2021-03-13T00_10_33_813Z-debug.log npm ERR! code 1 npm ERR! path /Users/me/my-app npm ERR! command failed npm ERR! command sh -c sh ./bin/setup.sh npm ERR! A complete log of this run can be found in: npm ERR! /Users/me/.npm/_logs/2021-03-13T00_10_33_860Z-debug.log A continuación se muestra la diferencia de package-lock.json entre --legacy-peer-deps y --force .
npm install --legacy-peer-deps , agrega esto en mi paquete-lock.json : "node_modules/@unimodules/react-native-adapter": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz", "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==", "dependencies": { "invariant": "^2.2.4", "lodash": "^4.5.0" }, "peerDependencies": { "react-native": "*", "react-native-web": "~0.13.7" } }, ... "@unimodules/react-native-adapter": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz", "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==", "requires": { "invariant": "^2.2.4", "lodash": "^4.5.0" } },npm install --force , en su lugar, agrega "node_modules/expo/node_modules/@unimodules/react-native-adapter": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz", "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==", "dependencies": { "invariant": "^2.2.4", "lodash": "^4.5.0" }, "peerDependencies": { "react-native": "*", "react-native-web": "~0.13.7" } }, "node_modules/expo/node_modules/inline-style-prefixer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz", "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==", "peer": true, "dependencies": { "css-in-js-utils": "^2.0.0" } }, "node_modules/expo/node_modules/react-native-web": { "version": "0.13.18", "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz", "integrity": "sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA==", "peer": true, "dependencies": { "array-find-index": "^1.0.2", "create-react-class": "^15.6.2", "deep-assign": "^3.0.0", "fbjs": "^1.0.0", "hyphenate-style-name": "^1.0.3", "inline-style-prefixer": "^5.1.0", "normalize-css-color": "^1.0.2", "prop-types": "^15.6.0", "react-timer-mixin": "^0.13.4" }, "peerDependencies": { "react": ">=16.5.1", "react-dom": ">=16.5.1" } }, ... "dependencies": { "@unimodules/react-native-adapter": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz", "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==", "requires": { "invariant": "^2.2.4", "lodash": "^4.5.0" } }, "inline-style-prefixer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz", "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==", "peer": true, "requires": { "css-in-js-utils": "^2.0.0" } }, "react-native-web": { "version": "0.13.18", "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz", "integrity": "sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA==", "peer": true, "requires": { "array-find-index": "^1.0.2", "create-react-class": "^15.6.2", "deep-assign": "^3.0.0", "fbjs": "^1.0.0", "hyphenate-style-name": "^1.0.3", "inline-style-prefixer": "^5.1.0", "normalize-css-color": "^1.0.2", "prop-types": "^15.6.0", "react-timer-mixin": "^0.13.4" } } } }, Como puede ver, npm install --force aún fija muchas versiones de dependencia, lo que es más estricto.
Entonces, para npm 7, si npm install falla debido a un problema de dependencia entre pares, lo primero que puede intentar es npm install --force .
Cuando el proyecto tiene un conflicto de versión de NPM y aparece un error.
Error
An unhandled exception occurred: The 'buildOptimizer' option cannot be used without 'aot'.En archivo .npmrc
legacy-peer-deps trueSímbolo del sistema
npm install