¿Cuál es la diferencia entre npm-shrinkwrap.json y package-lock.json?

158

Con el lanzamiento de npm @ 5 , ahora escribirá un mensaje a package-lock.jsonmenos que npm-shrinkwrap.jsonya exista.

Instalé npm @ 5 a nivel mundial a través de:

npm install npm@5 -g

Y ahora, si npm-shrinkwrap.jsonse encuentra un 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!

Así que mi conclusión es que debería reemplazar la envoltura retráctil con el package-lock.json.

Sin embargo, ¿por qué hay un nuevo formato para ello? ¿Qué puede package-lock.jsonhacer el que npm-shrinkwrap.jsonno puede?

k0pernikus
fuente

Respuestas:

176

Los archivos tienen exactamente el mismo contenido, pero hay algunas diferencias en la forma en que 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.jsonnunca se publica en npm, mientras que npm-shrinkwrapes por defecto
  • package-lock.json los archivos que no están en el paquete de nivel superior se ignoran, pero se respetan los archivos retráctiles que pertenecen a dependencias
  • npm-shrinkwrap.jsones compatible con versiones anteriores de npm 2, 3 y 4, mientras que package-lock.jsonnpm 5+ solo reconoce

Puede convertir un existente package-lock.jsonen un npm-shrinkwrap.jsonejecutando 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 utilizarlo package-lock.jsonporque es el predeterminado y su nombre es más claro para los principiantes de npm; alternativamente, es posible que desee utilizar la npm-shrinkwrap.jsoncompatibilidad con versiones anteriores de npm 2-4 si le resulta difícil asegurarse de que todos los miembros de su equipo de desarrollo tengan 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:

    1. usando a package-lock.jsonpara 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 su package.json, o
    2. usando un npm-shrinkwrap.jsonpara 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 debería 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.

Mark Amery
fuente
2
+1: ¿puedes aclarar tu segunda viñeta? ¿Cuál es la distinción entre ese comportamiento y tener un npm-shrinkwrap?
Rhys
2
@Rhys la segunda viñeta no importará en la práctica a menos que estés haciendo algo extraño. Básicamente, sólo dice que si una biblioteca de alguna manera hizo publicar una package-lock.json(lo que no es posible), entonces, si se va a instalar la biblioteca como una dependencia de algún otro paquete, de las bibliotecas package-lock.jsonserían ignorados por la NGP. Sin embargo, si una biblioteca publica un archivo npm-shrinkwrap.jsone instala la biblioteca como dependencia, también instalará como dependencias secundarias las versiones exactas de todas las dependencias especificadas en la biblioteca npm-shrinkwrap.json.
Mark Amery
¿Puede agregar que npm ciexiste para asegurar la instalación de package-lock.jsoncomo de solo lectura? ( npm installmuta la package-lock.jsonconfusión causante y los posibles errores y no aprovecha el package-lock.jsonper se.)
k0pernikus
@ k0pernikus No creo que haya ninguna diferencia entre cómo se npm cimaneja npm-shrinkwrap.jsony package-lock.json, ¿cuál es su relevancia para esta pregunta sobre la diferencia entre los dos archivos? Además, después de leer: creo que " npm install... no aprovecha el package-lock.json" ha sido falso desde npm 5.4 - Creo que npm installahora respeta su a package-lock menos que sea totalmente incompatible con su package.json, en cuyo caso este último tendrá prioridad. (Pero he estado fuera del mundo de JavaScript por un tiempo, ¿me estoy perdiendo algo?)
Mark Amery
27

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 CI usando 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 podríamos tener compatibilidad con versiones anteriores de riesgo relativamente bajo con una envoltura retráctil sin tener que hacer cosas extrañas como permitir la publicación mencionada en la publicación principal.

Serio
fuente
18
Todavía no tengo clara la diferencia. Si npm-shrinkwrapes para node_modules exactos ... ¿Supongo package-lock.jsonque el bloqueo es menos que exacto? Y si es así, ¿qué no es bloqueo que npm-shrinkwrapes bloqueo?
dman
te equivocaste @dman. package-lock es la nueva versión de npm-shrinkwrap. package-lock está desactivado (por lo que debe eliminar la función porque está habilitada de forma predeterminada), npm-shrinkwrap está habilitada (por lo que debe habilitarla porque no está incluida mi configuración predeterminada). la razón por la que introdujeron el bloqueo de paquetes es que 1. el usuario ahora tiene una forma más segura de lidiar con las dependencias porque está habilitado de forma predeterminada y 2. el nombre implica lo que es opuesto a "shrinkwrap". npm-shrinkwrap tenía algunas configuraciones especiales de comportamiento de dependencia que package-lock no tiene ahora. npm-shrinkwrap ahora está obsoleto.
SeriousM
10
Esto es incorrecto. Al decir que package-lock es la nueva versión de npm-shrinkwrap, estás diciendo que es un reemplazo. npm-shrinkwrap no está en desuso y tiene diferencias con package-lock.json. Además, package-lock.json tiene un error, mientras que npm-shrinkwrap no ... enfatizando más, por lo que no son el mismo código.
dman
También package-lock.json es intrusivo. Por lo tanto, puede causar fácilmente conflictos scm si llama "npm i", mientras que shrinkwrap debe generarse explícitamente y no causará conflictos en los servidores ci. Sí, puedo estar equivocado aquí.
norekhov
@dman "package-lock.json tiene un error mientras que npm-shrinkwrap no" , no, no lo tiene. No hay indicios de eso en el problema al que se ha vinculado; Ni siquiera lo menciona npm-shrinkwrap. Como noto en mi respuesta, la conversión de a package-lock.jsona npm-shrinkwrap.jsonliteralmente se realiza simplemente renombrando el archivo; que son "el mismo código".
Mark Amery
12

Creo que la idea era hacer que --save y shrinkwrap ocurrieran por defecto, 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í:

https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

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

Cody Brumfield
fuente