Archivos de bloqueo e instalaciones reproducibles
Los archivos de bloqueo fijan el grafo de dependencias exacto para que las laptops, CI y las compilaciones de producción instalen paquetes idénticos en todo momento.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Desarrollador: actualiza las dependencias intencionalmente
npm install
git add package.json package-lock.json
# CI: instalación limpia reproducible
npm ci# .github/workflows/ci.yml (extracto)
- run: npm ci
- run: npm testCuándo usarlo:
- CI no debe resolver nuevas versiones en cada ejecución del pipeline.
- Las compilaciones de Docker de producción necesitan
node_modulesdeterministas. - Las auditorías de seguridad deben hacer referencia a las mismas versiones que tú distribuyes.
Ejemplo de trabajo
# Dockerfile - compilación de API de múltiples etapas
FROM node:24.18.0-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
FROM node:24.18.0-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:24.18.0-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY package.json ./
CMD ["node", "dist/server.js"]# Verificación local: el archivo de bloqueo coincide con package.json
npm ci
npm testLo que esto demuestra:
npm cieliminanode_modulese instala exactamente desdepackage-lock.json.- La etapa
depsde Docker usa--omit=devpara una imagen de producción más pequeña. - La etapa de compilación ejecuta
npm cicompleto para que las devDependencies (TypeScript) estén disponibles para compilar.
Análisis profundo
Cómo funciona
package-lock.json(npm) registra las versiones resueltas, los hashes de integridad y la estructura anidada.npm installpuede actualizar el archivo de bloqueo cuando los rangos permiten versiones compatibles más nuevas.npm cifalla sipackage.jsony el archivo de bloqueo no coinciden, protegiendo a CI de la desviación.- pnpm usa
pnpm-lock.yaml; Yarn usayarn.lock- solo uno por repositorio.
Comandos del gestor
| Gestor | Comando de instalación congelada | Archivo de bloqueo |
|---|---|---|
| npm 10+ | npm ci | package-lock.json |
| pnpm | pnpm install --frozen-lockfile | pnpm-lock.yaml |
| Yarn Berry | yarn install --immutable | yarn.lock |
Notas de TypeScript
{
"scripts": {
"verify:lockfile": "npm ci && npm run typecheck && npm test"
}
}- Ejecuta
verify:lockfiledespués de fusionar PRs de dependencias para detectar reconstrucciones nativas faltantes. - Confirma los cambios del archivo de bloqueo en el mismo PR que las ediciones de
package.json.
Errores comunes
- Ejecutar npm install en CI - Resuelve versiones nuevas y oculta la desviación del archivo de bloqueo hasta la producción. Solución: usa
npm ciexclusivamente en los pipelines. - Confirmaciones parciales del archivo de bloqueo - Actualizar
package.jsonsin el archivo de bloqueo rompe a los compañeros de equipo y a CI. Solución: siempre confirma ambos archivos juntos. - Gestores mixtos -
package-lock.jsonmásyarn.lockcausa instalaciones impredecibles. Solución: elimina los archivos de bloqueo no utilizados; documenta el gestor elegido en el README. - Conflictos de fusión del archivo de bloqueo - Las ediciones manuales corrompen las entradas de integridad. Solución: regenera con
npm installdespués de resolverpackage.json. - Problemas de enmascaramiento de caché global - Las cachés obsoletas de CI sirven tarballs antiguos. Solución: clave las cachés en el hash del archivo de bloqueo; invalida en el cambio del archivo de bloqueo.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
npm install --package-lock-only | Auditar la resolución sin tocar node_modules | Necesitas verificar el comportamiento en tiempo de ejecución |
| Renovate / Dependabot | PRs de archivos de bloqueo automatizados con pruebas | Careces de CI para validar las actualizaciones |
| Volta / nvm pin | El mismo Node + npm en todas las máquinas | Reemplazar completamente los archivos de bloqueo |
Preguntas frecuentes
¿Cuál es la diferencia entre npm install y npm ci?
npm installpuede actualizar el archivo de bloqueo y reutilizarnode_modulesexistentes.npm cirequiere un archivo de bloqueo, eliminanode_modulese instala exactamente las versiones fijadas.- CI debe usar
npm ci; los desarrolladores usannpm installcuando cambian intencionalmente las dependencias.
¿Debo confirmar package-lock.json para las aplicaciones?
Sí. Las aplicaciones y los servicios desplegables siempre confirman el archivo de bloqueo. Las bibliotecas publicadas en npm pueden omitirlo, pero los paquetes internos aún deben bloquearse para una CI reproducible.
¿Cómo soluciono los errores de archivo de bloqueo desincronizado?
rm -rf node_modules
npm install
git add package-lock.jsonEjecuta las pruebas antes de enviar el archivo de bloqueo regenerado.
¿Funciona npm ci sin package-lock.json?
No. Genera uno con npm install primero, luego cambia CI a npm ci.
¿Cómo audito el grafo bloqueado?
npm audit --audit-level=highLa auditoría lee el grafo del archivo de bloqueo, no solo los rangos de package.json.
¿Debe Docker COPIAR package-lock.json?
Sí. Copia el archivo de bloqueo antes de npm ci para que las capas de dependencia se almacenen en caché independientemente de los cambios en el código fuente de la aplicación.
¿Qué pasa con las dependencias opcionales?
Los archivos de bloqueo también fijan los paquetes opcionales. npm ci los instala a menos que se omitan con banderas; documenta las dependencias opcionales específicas de la plataforma en el README.
¿Puedo usar npm ci con workspaces?
Sí. npm ci en la raíz del monorepo instala todos los workspaces desde el archivo de bloqueo raíz.
¿Con qué frecuencia debemos actualizar el archivo de bloqueo?
Semanalmente o mediante automatización (Renovate). Los parches de seguridad deben activar un PR con CI en verde antes de la fusión.
¿Afecta --omit=dev la integridad del archivo de bloqueo?
--omit=dev omite la instalación de devDependencies, pero aún requiere un archivo de bloqueo generado con ellas presentes en el momento de la compilación.
Relacionado
- Scripts de package.json -
npm ciluegonpm testen CI - Cadena de suministro: npm audit y Socket - auditar el grafo bloqueado
- Mejores prácticas de gestores de paquetes - política de un solo archivo de bloqueo
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.