Lockfiles & Instalações Reproduzíveis
Lockfiles fixam o grafo exato de dependências para que laptops, CI e builds de produção instalem pacotes idênticos a cada vez.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
# Desenvolvedor: atualiza dependências intencionalmente
npm install
git add package.json package-lock.json
# CI: instalação limpa e reproduzível
npm ci# .github/workflows/ci.yml (excerto)
- run: npm ci
- run: npm testQuando usar isso:
- A CI não deve resolver novas versões a cada execução do pipeline.
- Builds Docker de produção precisam de
node_modulesdeterminísticos. - Auditorias de segurança devem referenciar as mesmas versões que você envia.
Exemplo de Trabalho
# Dockerfile - build de API multi-estágio
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"]# Verificação local: lockfile corresponde a package.json
npm ci
npm testO que isso demonstra:
npm ciexcluinode_modulese instala exatamente a partir depackage-lock.json.- O estágio
depsdo Docker usa--omit=devpara uma imagem de produção menor. - O estágio
buildexecutanpm cicompleto para que devDependencies (TypeScript) estejam disponíveis para compilação.
Mergulho Profundo
Como Funciona
package-lock.json(npm) registra versões resolvidas, hashes de integridade e estrutura aninhada.npm installpode atualizar o lockfile quando os intervalos permitem versões compatíveis mais recentes.npm cifalha sepackage.jsone o lockfile discordarem, protegendo a CI contra desvios.- pnpm usa
pnpm-lock.yaml; Yarn usayarn.lock- apenas um por repositório.
Comandos do Gerenciador
| Gerenciador | Comando de instalação congelada | Lockfile |
|---|---|---|
| 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"
}
}- Execute
verify:lockfileapós mesclar PRs de dependência para capturar rebuilds nativos ausentes. - Confirme as alterações do lockfile no mesmo PR das edições de
package.json.
Armadilhas
- Executar npm install na CI - Resolve novas versões e oculta o desvio do lockfile até a produção. Correção: use
npm ciexclusivamente em pipelines. - Commits parciais do lockfile - Atualizar
package.jsonsem o lockfile quebra colegas de equipe e a CI. Correção: sempre confirme ambos os arquivos juntos. - Gerenciadores mistos -
package-lock.jsonmaisyarn.lockcausam instalações imprevisíveis. Correção: exclua lockfiles não utilizados; documente o gerenciador escolhido no README. - Conflitos de mesclagem de lockfile - Edições manuais corrompem as entradas de integridade. Correção: regenere com
npm installapós resolverpackage.json. - Problemas de mascaramento de cache global - Caches de CI desatualizados servem tarballs antigos. Correção: chaveie caches pelo hash do lockfile; invalide em caso de alteração do lockfile.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
npm install --package-lock-only | Auditar resolução sem tocar em node_modules | Você precisa verificar o comportamento em tempo de execução |
| Renovate / Dependabot | PRs automatizados de lockfile com testes | Você não tem CI para validar atualizações |
| Volta / nvm pin | Mesmo Node + npm entre máquinas | Substituir lockfiles inteiramente |
FAQs
Qual é a diferença entre npm install e npm ci?
npm installpode atualizar o lockfile e reutilizarnode_modulesexistentes.npm cirequer um lockfile, removenode_modulese instala versões exatamente fixadas.- A CI deve usar
npm ci; desenvolvedores usamnpm installao alterar dependências intencionalmente.
Devo confirmar package-lock.json para aplicações?
Sim. Aplicações e serviços implantáveis sempre confirmam o lockfile. Bibliotecas publicadas no npm podem omiti-lo, mas pacotes internos ainda devem ser fixados para CI reproduzível.
Como corrijo erros de lockfile fora de sincronia?
rm -rf node_modules
npm install
git add package-lock.jsonExecute testes antes de enviar o lockfile regenerado.
npm ci funciona sem package-lock.json?
Não. Gere um com npm install primeiro, depois mude a CI para npm ci.
Como auditar o grafo fixado?
npm audit --audit-level=highO audit lê o grafo do lockfile, não apenas os intervalos de package.json.
Devo copiar package-lock.json no Docker?
Sim. Copie o lockfile antes de npm ci para que as camadas de dependência sejam cacheadas independentemente das alterações de origem do aplicativo.
E as dependências opcionais?
Lockfiles também fixam pacotes opcionais. npm ci os instala, a menos que sejam omitidos com flags; documente dependências opcionais específicas da plataforma no README.
Posso usar npm ci com workspaces?
Sim. npm ci na raiz do monorepo instala todos os workspaces a partir do lockfile raiz.
Com que frequência devemos atualizar o lockfile?
Semanalmente ou via automação (Renovate). Correções de segurança devem acionar um PR com CI verde antes de mesclar.
O --omit=dev afeta a integridade do lockfile?
--omit=dev pula a instalação de devDependencies, mas ainda requer um lockfile gerado com elas presentes no momento da compilação.
Relacionados
- Scripts package.json -
npm cie depoisnpm testna CI - Cadeia de Suprimentos: npm audit & Socket - auditar o grafo fixado
- Melhores Práticas de Gerenciadores de Pacotes - política de um único lockfile
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.