Si dos desarrolladores diferentes usan versiones diferentes de node (12/15) y npm (6/7) en un proyecto que se creó originalmente usando un package-lock.json
"lockfileVersion": 1
, cuando el desarrollador que usa npm 7x instala una nueva paquetes parece que el package-lock.json
se vuelve a crear usando "lockfileVersion": 2
.
Esto parece causar problemas para el desarrollador que usa npm v6, ya que intenta funcionar con lockfileVersion 2
, pero termina produciendo nuevas diferencias.
npm WARN read-shrinkwrap Esta versión de npm es compatible con lockfileVersion@1, pero se generó package-lock.json para lockfileVersion@2. ¡Intentaré hacerlo lo mejor posible con él!
¿Hay alguna forma de especificar que las versiones más nuevas de npm
solo usen "lockfileVersion": 1
? ¿O solo tenemos que obtener todos los desarrolladores en la misma versión de npm
?
Prueba esto: npm i -g npm@latest
Si esto no soluciona su problema, intente reiniciar su PC.
npm WARN read-shrinkwrap Esta versión de npm es compatible con lockfileVersion@1, pero se generó package-lock.json para lockfileVersion@2. ¡Intentaré hacerlo lo mejor posible con él!
para superar este problema, ejecute el comando
npm i -g npm@latest
globalmente y ejecutando el comando
npm i npm@latest
en el archivo del proyecto me ayudó a resolver el problema.
Me encontré con el mismo problema hoy. Estoy trabajando en un proyecto con un desarrollador que tiene una versión diferente de npm
(>7) y me encontré con el mismo problema. Simplemente actualicé mi versión de npm
a la última versión que estaba utilizando el otro desarrollador como se mencionó anteriormente. Los siguientes son los pasos para actualizar su npm
(para Windows):
Primero, asegúrese de que puede ejecutar scripts en su sistema ejecutando el siguiente comando desde un PowerShell
elevado. Para ejecutar PowerShell
como Administrator
, haga clic en Start
, busque PowerShell
, haga clic con el botón derecho en PowerShell
y seleccione Run as Administrator
.
A continuación, ejecute los siguientes comandos:
Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
Luego, para instalar y usar esta herramienta de actualización, ejecute el siguiente comando (también desde un PowerShell
o cmd.exe
elevado). Nota: esta herramienta requiere al menos Node v8
npm install --global --production npm-windows-upgrade npm-windows-upgrade
¿Quiere simplemente instalar la última versión? Por supuesto:
npm-windows-upgrade --npm-version latest
Ahora puede seleccionar la versión que desea instalar desde la línea de comandos.
https://github.com/felixrieseberg/npm-windows-upgrade
El enlace de arriba es la herramienta que he usado. Esta herramienta es tanto para Linux como para Windows. Espero que ayude.
Por lo que puedo ver, los documentos de npm dicen que npm v6 funcionará con archivos de bloqueo de la versión 2 a pesar de la advertencia, por lo que no necesita hacer ninguna de las cosas sugeridas en la respuesta aceptada y puede ignorar con seguridad el mensaje de advertencia.
En las notas de lanzamiento de npm 7 dijeron:
Un cambio a tener en cuenta es el nuevo formato de archivo de bloqueo, que es retrocompatible con los usuarios de npm 6. El archivo de bloqueo v2 desbloquea la capacidad de hacer compilaciones deterministas y reproducibles para producir un árbol de paquetes.
En los documentos de npm dice (mi énfasis):
lockfileVersion
Una versión entera, comenzando en 1 con el número de versión de este documento cuya semántica se usó al generar este paquete-lock.json.
Tenga en cuenta que el formato de archivo cambió significativamente en npm v7 para rastrear información que, de otro modo, habría requerido buscar en node_modules o en el registro de npm. Los archivos de bloqueo generados por npm v7 contendrán lockfileVersion: 2.
- No se proporcionó una versión: un archivo de ajuste "antiguo" de una versión de npm anterior a npm v5.
- 1: La versión del archivo de bloqueo utilizada por npm v5 y v6.
- 2: La versión del archivo de bloqueo utilizada por npm v7, que es compatible con versiones anteriores de los archivos de bloqueo v1.
- 3: La versión del archivo de bloqueo utilizada por npm v7, sin posibilidades de compatibilidad con versiones anteriores. Esto se usa para el archivo de bloqueo oculto en node_modules/.package-lock.json, y probablemente se usará en una versión futura de npm, una vez que la compatibilidad con npm v6 ya no sea relevante .
Es por eso que pueden actualizar automáticamente los archivos de bloqueo de v1 a v2, que mencionas, sin romper nada.
¿Hay alguna forma de especificar que las versiones más nuevas de
npm
solo usen"lockfileVersion": 1
? ¿O solo tenemos que obtener todos los desarrolladores en la misma versión denpm
?
Le aconsejaré fijar la versión de Node/NPM y alinearla en sus entornos (desarrollo, puesta en escena y producción).
puede aprovechar nvm
para administrar la versión del nodo agregando a su proyecto el archivo .nvmrc
(no olvide almacenarlo en su control de código fuente).
por ejemplo, .nvmrc
se verá así:
$ cat .nvmrc 14.15.0
luego, puede usar nvm install && nvm use
para usar la versión anclada de Node.
NPM también admiteengines
:
Puede especificar la versión del nodo en el que funcionan sus cosas:
{ "engines" : { "node" : ">=0.10.3 <0.12" } }
Y, al igual que con las dependencias, si no especifica la versión (o si especifica "*" como la versión), cualquier versión de Node servirá.
Si especifica un campo de "motores", entonces npm requerirá que el "nodo" esté en algún lugar de esa lista. Si se omite "motores", entonces npm simplemente asumirá que funciona en Node.
También puede usar el campo "motores" para especificar qué versiones de npm son capaces de instalar correctamente su programa. Por ejemplo:
{ "engines" : { "npm" : "~1.0.20" } }
A menos que el usuario haya configurado el indicador de configuración estricta del motor, este campo es solo de asesoramiento y solo generará advertencias cuando su paquete se instale como una dependencia.
Otro enfoque es utilizar un contenedor Docker como entorno de tiempo de ejecución para el desarrollo y la ejecución, lo que implica que no necesita instalar Node ni NPM. p.ej
$ mkdir my-project $ cd my-project $ docker run --rm -it -v $PWD:/app --entrypoint /bin/bash --workdir /app node:14.15.0 root@4da6ee3c2ac0:/app# npm init -y Wrote to /app/package.json: { "name": "app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } root@4da6ee3c2ac0:/app# npm install npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN app@1.0.0 No description npm WARN app@1.0.0 No repository field. up to date in 1.694s found 0 vulnerabilities root@4da6ee3c2ac0:/app# exit exit $ ls -x1 package-lock.json package.json
Como puedes ver, sin Node, ni NPM:
npm init -y
) Dado que el comando de docker run
anterior es largo, es posible que desee aprovechar docker-compose para un flujo de trabajo más optimizado.