¿Cuál es la diferencia entre npm-shrinkwrap.json y package-lock.json?
(3)
Creo que la idea era hacer que --save y shrinkwrap sucedan de forma predeterminada, pero evite cualquier problema potencial con un shrinkwrap que ocurra donde no se quería. Entonces, simplemente le dieron un nuevo nombre de archivo para evitar conflictos. Alguien de npm lo explicó más a fondo aquí:
La cita relevante:
npm publica la mayoría de los archivos en su directorio fuente de manera predeterminada, y las personas han estado publicando shrinkwraps durante años. No queríamos romper la compatibilidad. Con --save y shrinkwrap por defecto, existía un gran riesgo de que accidentalmente ingresara y se propagara a través del registro, y básicamente dejaba nula nuestra capacidad para actualizar los departamentos y deduplicar ...
Entonces elegimos un nuevo nombre. Y elegimos un nuevo nombre de repente. El nuevo archivo de bloqueo comparte básicamente todo el mismo código, exactamente el mismo formato
Con el
lanzamiento de npm @ 5
, ahora escribirá un
package-lock.json
menos que ya exista un
npm-shrinkwrap.json
.
Instalé npm @ 5 a nivel mundial a través de:
npm install npm@5 -g
Y ahora, si se encuentra un
npm-shrinkwrap.json
durante:
npm install
se imprimirá una advertencia:
npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I''ll try to do my best with it!
Entonces, mi
package-lock.json
es que debería reemplazar la
package-lock.json
con el
package-lock.json
.
Sin embargo, ¿por qué hay un nuevo formato para ello?
¿Qué puede hacer el
package-lock.json
que
npm-shrinkwrap.json
no puede hacer?
Los archivos tienen exactamente el mismo contenido, pero hay algunas diferencias en cómo npm los maneja, descritos en el sitio de documentos y también en un archivo de documentos en el repositorio de npm que comienza abordando explícitamente la diferencia entre estos dos archivos :
-
package-lock.json
nunca se publica en npm, mientras quenpm-shrinkwrap
es por defecto -
package-lock.json
archivospackage-lock.json
que no están en el paquete de nivel superior, pero sepackage-lock.json
archivospackage-lock.json
que pertenecen a dependencias -
npm-shrinkwrap.json
es compatible con versiones anteriores de npm 2, 3 y 4, mientras quepackage-lock.json
solo es reconocido por npm 5+
Puede convertir un
package-lock.json
existente en
npm-shrinkwrap.json
ejecutando
npm shrinkwrap
.
Así:
-
Si no está publicando su paquete en npm, la elección entre estos dos archivos es de poca importancia.
Es posible que desee utilizar
package-lock.json
porque es el valor predeterminado y su nombre es más claro para los principiantes de npm; alternativamente, es posible que desee utilizarnpm-shrinkwrap.json
para la compatibilidad con versiones anteriores de npm 2-4 si le resulta difícil asegurarse de que todos en su equipo de desarrollo estén en npm 5+. (Tenga en cuenta que npm 5 se lanzó el 25 de mayo de 2017; la compatibilidad con versiones anteriores será cada vez menos importante a medida que avancemos a partir de esa fecha, ya que la mayoría de las personas eventualmente se actualizarán). -
Si está publicando su paquete en npm, puede elegir entre:
-
usando un
package-lock.json
para registrar exactamente qué versiones de dependencias instaló, pero permitiendo que las personas que instalen su paquete usen cualquier versión de las dependencias que sea compatible con los rangos de versión dictados por supackage.json
, o -
usando
npm-shrinkwrap.json
para garantizar que todos los que instalen su paquete obtengan exactamente la misma versión de todas las dependencias
La opinión oficial descrita (muy brevemente) en los documentos es que la opción 1 debe usarse para las bibliotecas (presumiblemente para reducir la cantidad de duplicación de paquetes causada cuando muchas de las dependencias de un paquete dependen de versiones ligeramente diferentes de la misma dependencia secundaria) , pero esa opción 2 podría ser razonable para los ejecutables que se instalarán globalmente. -
usando un
Explicación del desarrollador de NPM :
La idea es definitivamente que package-lock.json sea el último y el más grande en tecnología shrinkwrap, y npm-shrinkwrap.json esté reservado para esas pocas personas preciosas que se preocupan mucho por que sus bibliotecas tengan un nodo_módulo exacto, y para las personas que desean que CI use npm @> = 2 para instalar un árbol en particular sin tener que cambiar su versión npm.
El nuevo archivo de bloqueo ("package-lock.json") comparte básicamente todo el mismo código, exactamente el mismo formato que npm-shrinkwrap (¡puede cambiarles el nombre entre ellos!). También es algo que la comunidad parece entender: "tiene un archivo de bloqueo" parece hacer clic mucho más rápido con las personas. Finalmente, tener un nuevo archivo significaba que podíamos tener compatibilidad con versiones anteriores de riesgo relativamente bajo con una envoltura retráctil sin tener que hacer cosas raras como permitir la publicación mencionada en la publicación principal.