npm 5 se lanzó hoy y una de las nuevas características incluye instalaciones deterministas con la creación de un package-lock.json
archivo.
¿Se supone que este archivo debe mantenerse en el control de origen?
Supongo que es similar a yarn.lock
y composer.lock
, que se supone que deben mantenerse en el control de la fuente.
git log
facilita el trato.Respuestas:
Sí,
package-lock.json
está destinado a ser verificado en el control de fuente. Si está usando npm 5, puede ver esto en la línea de comando:created a lockfile as package-lock.json. You should commit this file.
Segúnnpm help package-lock.json
:fuente
package-lock.json
a mi.gitignore
... me estaba causando muchos más problemas que resolverlos. Siempre entra en conflicto cuando fusionamos o modificamos, y cuando una fusión da como resultado unapackage-lock.json
corrupción en el servidor de CI, es simplemente un dolor tener que seguir reparándolo.Sí, está destinado a ser registrado. Quiero sugerir que obtenga su propia confirmación única. Descubrimos que agrega mucho ruido a nuestras diferencias.
fuente
package-lock.json
archivo cuando se trabaja en un sistema SCM con troncales y ramificaciones? Estoy haciendo algunos cambios en una rama que deben fusionarse con el tronco ... ¿ahora tengo que (de alguna manera) resolver los conflictos entre los dospackage-lock.json
archivos? Esto se siente doloroso.Si deberías:
package-lock.json
.npm ci
lugar denpm install
cuando crea sus aplicaciones tanto en su CI como en su máquina de desarrollo localEl
npm ci
flujo de trabajo requiere la existencia de apackage-lock.json
.Una gran desventaja del
npm install
comando es su comportamiento inesperado que puede mutarpackage-lock.json
, mientras quenpm ci
solo usa las versiones especificadas en el archivo de bloqueo y produce un errorpackage-lock.json
y nopackage.json
están sincronizadospackage-lock.json
falta unPor lo tanto, ejecutándose
npm install
localmente, esp. en equipos más grandes con múltiples desarrolladores, puede generar muchos conflictos dentro de lospackage-lock.json
desarrolladores y decidir eliminarlos por completopackage-lock.json
.Sin embargo, existe un fuerte caso de uso para poder confiar en que las dependencias del proyecto se resuelven repetidamente de manera confiable en diferentes máquinas.
De a
package-lock.json
obtienes exactamente eso: un estado conocido de trabajo.En el pasado, tenía proyectos sin archivos
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
cuya construcción fallaría algún día porque una dependencia aleatoria recibió una actualización de última hora.Esos problemas son difíciles de resolver ya que a veces tienes que adivinar cuál fue la última versión de trabajo.
Si desea agregar una nueva dependencia, aún ejecuta
npm install {dependency}
. Si desea actualizar, use cualquieranpm update {dependency}
onpm install ${dependendency}@{version}
y confirme el cambiopackage-lock.json
.Si falla una actualización, puede volver al último trabajo conocido
package-lock.json
.Para citar npm doc :
Y en lo que respecta a la diferencia entre
npm ci
vsnpm install
:Nota: publiqué una respuesta similar aquí
fuente
whose build would fail one day because a random dependency got a breaking update
tipo de problema. Aunque deja la posibilidad de que la dependencia del niño cause el mismo problema.Sí, la mejor práctica es hacer el check-in (SÍ, CHECK-IN)
Estoy de acuerdo en que causará mucho ruido o conflicto al ver la diferencia. Pero los beneficios son:
^1.2.3
en supackage.json
, pero ¿cómo puede asegurarse de que cada veznpm install
elija la misma versión en su máquina de desarrollo y en el servidor de compilación, especialmente esos paquetes de dependencia indirectos? Bueno,package-lock.json
se asegurará de eso. (Con la ayuda denpm ci
que instala paquetes basados en el archivo de bloqueo)npm audit fix
(creo que la función de auditoría es de npm versión 6).fuente
npm ci
. ¡La gente frecuentemente menciona que apackage-lock.json
permite una instalación determinista de paquetes, pero casi nunca menciona el comando que facilita este comportamiento! Mucha gente probablemente asumen incorrectamentenpm install
instala exactamente lo que está en el archivo de bloqueo ...npm ci
. Su equipo / desarrollador principal puede decidir cuándo actualizar. Si todos lo cometen arbitrariamente, no tiene sentido, y solo está creando ruido en su repositorio. La documentación de NPM debería aclarar esto. Creo que la mayoría de los desarrolladores están confundidos por esta característica.No confirmo este archivo en mis proyectos. Cuál es el punto de ?
Aunque es cierto que nunca uso ^ en mi package.json para libs porque tuve malas experiencias con él.
fuente
package-lock.json
. Es posible que algunos repositorios no requieran los beneficios que se obtienen al tenerlo y prefieran no tener contenido generado automáticamente en la fuente.Para las personas que se quejan del ruido al hacer git diff:
Lo que hice fue usar un alias:
Para ignorar package-lock.json en diffs para todo el repositorio (todos los que lo usan), puede agregar esto a
.gitattributes
:Esto dará como resultado diferencias que muestran "Los archivos binarios a / package-lock.json y b / package-lock.json difieren cada vez que se modifica el archivo de bloqueo del paquete. Además, algunos servicios de Git (especialmente GitLab, pero no GitHub) también excluirán estos archivos (¡no se han cambiado más de 10k líneas!) desde los diferenciales cuando se visualizan en línea al hacer esto.
fuente
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
en mi .bashrc en lugar de un alias.Sí, puedes confirmar este archivo. De los documentos oficiales de npm :
fuente
npm ci
instalación desde el paquete-lock.jsonDeshabilitar globalmente package-lock.json
escriba lo siguiente en su terminal:
esto realmente funciona para mí como magia
fuente
~/.npmrc
(al menos en mis macos) con contenidopackage-lock=false
y lo mismo se puede hacer en cualquier proyecto específico juntonode_modules/
(por ejemploecho 'package-lock=false' >> .npmrc
Sí, es una práctica estándar comprometer package-lock.json
La razón principal para cometer package-lock.json es que todos en el proyecto están en la misma versión del paquete.
Pros: -
Contras:-
Editar: - npm install no asegurará que todos en el proyecto estén en la misma versión del paquete. npm ci te ayudará con esto.
fuente
npm ci
lugar denpm install
.Mi uso de npm es generar css / js minified / uglified y generar el javascript necesario en las páginas servidas por una aplicación django. En mis aplicaciones, Javascript se ejecuta en la página para crear animaciones, algunas veces realizar llamadas ajax, trabajar dentro de un marco VUE y / o trabajar con el CSS. Si package-lock.json tiene un control superior sobre lo que está en package.json, entonces puede ser necesario que haya una versión de este archivo. En mi experiencia, no afecta lo que instala npm install, o si lo hace, hasta la fecha no ha afectado negativamente las aplicaciones que despliegue a mi conocimiento. No uso mongodb u otras aplicaciones que tradicionalmente son clientes ligeros.
Elimino package-lock.json del repositorio porque npm install genera este archivo, y npm install es parte del proceso de implementación en cada servidor que ejecuta la aplicación. El control de versiones de nodo y npm se realiza manualmente en cada servidor, pero tengo cuidado de que sean iguales.
Cuando
npm install
se ejecuta en el servidor, cambia package-lock.json, y si hay cambios en un archivo que el repositorio registra en el servidor, el próximo despliegue WONT le permitirá extraer nuevos cambios desde el origen. Es decir, no se puede implementar porque la extracción sobrescribirá los cambios que se han realizado en package-lock.json.Ni siquiera puede sobrescribir un paquete-lock.json generado localmente con lo que está en el repositorio (restablecer el maestro de origen duro), ya que npm se quejará cuando emita un comando si el paquete-lock.json no refleja lo que está en node_modules debido a la instalación de npm, rompiendo así la implementación. Ahora, si esto indica que se han instalado versiones ligeramente diferentes en node_modules, una vez más, eso nunca me ha causado problemas.
Si node_modules no está en su repositorio (y no debería estarlo), se debe ignorar package-lock.json.
Si me falta algo, corríjame en los comentarios, pero el punto de que se toma la versión de este archivo no tiene sentido. El archivo package.json tiene números de versión, y supongo que este archivo es el que se usa para construir paquetes cuando se produce la instalación de npm, ya que cuando lo elimino, la instalación de npm se queja de la siguiente manera:
y la compilación falla, sin embargo, al instalar node_modules o aplicar npm para compilar js / css, no se presenta ninguna queja si elimino package-lock.json
fuente