npm @ 5 ha sido publicado, tiene una nueva característica package-lock.json file (after npm install) que me confunde. Quiero saber, ¿cuál es el efecto de este archivo?
Almacena un árbol de dependencias exacto y versionado en lugar de usar versiones destacadas como package.json (por ejemplo, 1.0. *). Esto significa que puede garantizar las dependencias para otros desarrolladores o lanzamientos de productos, etc. También tiene un mecanismo para bloquear el árbol, pero generalmente se regenerará si cambia package.json.
De los documentos npm :
package-lock.json se genera automáticamente para cualquier operación en la que npm modifique el árbol node_modules o package.json. Describe el árbol exacto que se generó, de modo que las instalaciones posteriores pueden generar árboles idénticos, independientemente de las actualizaciones de dependencia intermedias.
Este archivo está destinado a ser confirmado en repositorios de origen y sirve para varios propósitos:
Describa una representación única de un árbol de dependencias de modo que se garantice que los compañeros de equipo, las implementaciones y la integración continua instalen exactamente las mismas dependencias.
Proporcione una facilidad para que los usuarios "viajen en el tiempo" a estados anteriores de node_modules sin tener que confirmar el directorio en sí.
Para facilitar una mayor visibilidad de los cambios de árbol a través de diferencias de control de fuente legible.
Y optimice el proceso de instalación permitiendo que npm omita las resoluciones de metadatos repetidos para paquetes instalados previamente ".
Para responder a la pregunta de jrahhali a continuación sobre el uso de package.json con números de versión exactos. Tenga en cuenta que su package.json contiene solo sus dependencias directas, no las dependencias de sus dependencias (a veces llamadas dependencias anidadas). Esto significa que con el paquete estándar.json no puede controlar las versiones de esas dependencias anidadas, hacer referencia a ellas directamente o las dependencias pares no ayudarán, ya que tampoco controla la tolerancia de versión que sus dependencias directas definen para estas dependencias anidadas .
Incluso si bloquea las versiones de sus dependencias directas, no puede garantizar al 100% que su árbol de dependencias sea idéntico cada vez. En segundo lugar, es posible que desee permitir cambios sin interrupciones (basados en versiones semánticas) de sus dependencias directas, lo que le brinda aún menos control de las dependencias anidadas, además de que no puede garantizar que sus dependencias directas no rompan en algún momento las reglas de versiones semánticas. sí mismos.
La solución a todo esto es el archivo de bloqueo que, como se describió anteriormente, bloquea en las versiones del árbol de dependencias completo. Esto le permite garantizar su árbol de dependencias para otros desarrolladores o para versiones, al tiempo que permite probar nuevas versiones de dependencias (directas o indirectas) utilizando su package.json estándar.
NÓTESE BIEN. El anterior Jink Shrink Wrap hizo casi lo mismo, pero el archivo de bloqueo lo renombra para que su función sea más clara. Si ya hay un archivo retráctil en el proyecto, se utilizará en lugar de cualquier archivo de bloqueo.
package-lock.jsonarchivo se actualiza cada vez que llama a npm install desde NPM 5.1. (cambio en github.com/npm/npm/issues/16866 , ejemplo en github.com/npm/npm/issues/17979 ) Por lo tanto, ya no se puede usar para configurar las mismas versiones para todos los desarrolladores , a menos que especifique versiones exactas como en1.2.3lugar de1.2.*en supackage.jsonarchivo.npm cicomonpm installactualizará el paquete-lock.json mientras que ci usa su contenido. Solo connpm ciusted obtendrá construcciones robustas y repetibles.Es una mejora muy importante para npm: garantiza exactamente la misma versión de cada paquete .
¿Cómo asegurarse de que su proyecto se construyó con los mismos paquetes en diferentes entornos en un momento diferente? Digamos que puede usarlo
^1.2.3en supackage.json, o algunas de sus dependencias lo están usando de esa manera, pero ¿cómo puede asegurarse de que cada veznpm installelija la misma versión en su máquina de desarrollo y en el servidor de compilación? package-lock.json se asegurará de eso.npm installvolverá a generar el archivo de bloqueo, cuando esté en el servidor de compilación o en el servidor de implementación, haganpm ci(que leerá el archivo de bloqueo e instalará todo el árbol del paquete)fuente
package-lock.jsonen absoluto el archivo. Simplemente se instalapackage.jsoncomo solía hacerlo. Para utilizar elpackage-lock.jsonarchivo, debe utilizar el nuevo comando "npm ci", que instalará las versiones exactas enumeradas enpackage-lock.jsonlugar de los rangos de versiones indicadospackage.json.npm installno leerpackage-lock.json. Para reproducir, haga lo siguiente. usando este package.json, ejecutenpm install{... "devDependencies": {"sinon": "7.2.2"}} Ahora copie / peguepackage.jsonypackage-lock.jsonen un nuevo directorio. Cambiepackage.jsona: "sinon": "^ 7.2.2" ejecutarnpm install. npm lee desde package-lock.json e instala 7.2.2 en lugar de 7.3.0. Sin package-lock.json, se instalaría 7.3.0.package-lock.json, la única forma razonable de hacerlo es eliminarlopackage-lock.jsony regenerarlo usandonpm install. (No desea editar manualmentepackage-lock.json). Cambiar el valor de la propiedad "versión" (cerca de la parte superior) depackage.jsoncambiará lo mismo enpackage-lock.jsononnpm install, pero agregar un cursor a una dependencia no hará lo mismopackage-lock.json.package.jsonen algo que puede modificar manualmente ypackage-lock.jsoncomo algo que nunca toca manualmente. Siempre controlas la versión de AMBOS archivos, especialmentepackage-lock.json. Abra ambos archivos, edite manualmente el nombre del proyectopackage.json, ejecutenpm instally observe cómo cambia el nombre del proyectopackage-lock.json.licenseno parece ser registrada enpackage-lock.json.npm ci,npm installsolo usará package.json, aunque se proporcione el archivo de bloqueopackage-lock.jsonse escribe cuando un valor numérico en una propiedad como la propiedad "versión" o una propiedad de dependencia se cambia enpackage.json.Si estos valores numéricos en
package.jsonypackage-lock.jsoncoinciden,package-lock.jsonse lee de.Si estos valores numéricos en
package.jsonypackage-lock.jsonno coinciden,package-lock.jsonse escribe con esos nuevos valores y con nuevos modificadores como el cursor y la tilde si están presentes. Pero es el número el que está activando el cambiopackage-lock.json.Para ver a qué me refiero, haga lo siguiente. Utilizando
package.jsonsinpackage-lock.json, ejecutarnpm installcon:package-lock.jsonahora tendrá:Ahora copie / pegue ambos archivos en un nuevo directorio. Cambiar
package.jsona (solo agregando intercalación):ejecutar
npm install. Si no hubiera ningúnpackage-lock.jsonarchivo, se instalaría [email protected].npm installestá leyendo depackage-lock.jsone instalando 7.2.2.Ahora cambie
package.jsona:ejecutar
npm install.package-lock.jsonha sido escrito y ahora mostrará:fuente
Una cosa importante a mencionar también es la mejora de seguridad que viene con el archivo de bloqueo de paquete. Dado que mantiene todos los hashes de los paquetes si alguien manipula el registro público npm y cambia el código fuente de un paquete sin siquiera cambiar la versión del paquete, el archivo de bloqueo del paquete lo detectará.
fuente
package-lock.json se genera automáticamente para cualquier operación en la que npm modifique el árbol node_modules o package.json. Describe el árbol exacto que se generó, de modo que las instalaciones posteriores pueden generar árboles idénticos, independientemente de las actualizaciones de dependencia intermedias.
Describe una representación única de un árbol de dependencias de modo que se garantiza que los compañeros de equipo, las implementaciones y la integración continua instalen exactamente las mismas dependencias. Contiene las siguientes propiedades.
}
fuente
Npm crea y utiliza este archivo automáticamente para realizar un seguimiento de las instalaciones de sus paquetes y para gestionar mejor el estado y el historial de las dependencias de su proyecto. No debe alterar el contenido de este archivo.
fuente
package-lock.json: contiene los detalles exactos de la versión que está instalada actualmente para su aplicación.
fuente