
npm install vs npm ci: O Guia DEFINITIVO!
Aprenda a diferença crucial entre npm install e npm ci e por que usar o comando certo pode salvar seu build de produção e CI/CD de falhas catastróficas.
✨TL;DR / Sumário Executivo
Aprenda a diferença crucial entre npm install e npm ci e por que usar o comando certo pode salvar seu build de produção e CI/CD de falhas catastróficas.
💡 TL;DR (Resumo)
- Desenvolvimento: Use
npm install(ounpm i) para adicionar, remover ou atualizar pacotes. Ele pode modificar seupackage-lock.json.- Produção/CI/CD: Use
npm cipara instalar dependências. Ele é mais rápido, mais seguro e garante builds 100% reprodutíveis usando exatamente as versões dopackage-lock.json. Ele nunca modifica seus arquivospackage.jsonoupackage-lock.json.
📊 Tabela Comparativa Completa
| Aspecto | npm install | npm ci |
|---|---|---|
| Velocidade | Média (10-30s) | Rápida (5-15s) |
| Determinístico | ❌ Não garantido | ✅ 100% reproduzível |
Modifica package.json | ❌ Não | ❌ Não |
Modifica package-lock.json | ✅ Sim | ❌ Nunca |
Requer package-lock.json | ❌ Opcional | ✅ Obrigatório |
Remove node_modules antes | ❌ Não | ✅ Sim (automático) |
Instala devDependencies | ✅ Sim | ✅ Sim (pode desativar) |
| Aceita ranges (^, ~) | ✅ Sim | ❌ Não (só exato) |
| Adiciona novas deps | ✅ Sim | ❌ Não |
| Cache | Usa | Otimizado |
| Uso ideal | Desenvolvimento Local | CI/CD & Produção |
🔍 Explicação Detalhada
npm install (ou npm i)
Como funciona:
npm install
# Passos internos:
# 1. Lê package.json
# 2. Lê package-lock.json (se existir)
# 3. Resolve árvore de dependências
# 4. Compara com node_modules existente
# 5. Atualiza apenas o necessário
# 6. PODE modificar package-lock.json
# 7. Instala em node_modulesQuando usar:
✅ Primeira vez no projeto:
git clone https://github.com/seu-projeto.git
cd seu-projeto
npm install # Cria package-lock.json✅ Adicionar nova dependência:
npm install lodash
npm install --save-dev typescript✅ Atualizar dependências:
npm install lodash@latest
npm update✅ Desenvolvimento ativo:
# Trabalhando localmente
npm installComportamento com versões:
{
"dependencies": {
"next": "^15.0.3"
}
}# Se 15.0.5 foi lançado:
npm install
# Pode instalar 15.0.5 (dentro do range ^)
# Atualiza package-lock.json com 15.0.5npm ci (Clean Install)
Como funciona:
npm ci
# Passos internos:
# 1. Verifica se package-lock.json existe (OBRIGATÓRIO)
# 2. Remove node_modules COMPLETAMENTE
# 3. Instala EXATAMENTE as versões do lock
# 4. NUNCA modifica package-lock.json
# 5. Falha se package.json e lock não batem
# 6. Mais rápido (otimizado)Quando usar:
✅ CI/CD Pipelines (SEMPRE!):
# .github/workflows/ci.yml
- name: Install dependencies
run: npm ci # Garante reprodutibilidade✅ Builds de produção (SEMPRE!):
# No servidor
git pull
npm ci
npm run build✅ Ambientes de teste:
# Docker
RUN npm ci --only=production✅ Após git pull (RECOMENDADO):
git pull origin main
npm ci # Garante mesmas versões do time✅ Limpar problemas:
# Algo quebrou? Limpar tudo
npm ci # Remove node_modules e reinstalaComportamento com versões:
// package.json
{
"dependencies": {
"next": "^15.0.3"
}
}
// package-lock.json
{
"next": {
"version": "15.0.3"
}
}# Mesmo que 15.0.5 exista:
npm ci
# Instala EXATAMENTE 15.0.3 (do lock)🎮 Exemplos de Uso no Mundo Real
Cenário 1: Novo desenvolvedor no time
# Dia 1 - Clonar projeto
git clone https://github.com/empresa/projeto.git
cd projeto
# Opção A: npm install (funciona)
npm install
# Opção B: npm ci (MELHOR - mais rápido e exato)
npm ci
# Por quê npm ci?
# - Mais rápido
# - Garante mesmas versões do time
# - Evita "funciona na minha máquina"Cenário 2: Adicionar biblioteca
# Precisa adicionar Express
npm install express
# npm ci NÃO funciona aqui!
# npm ci não adiciona pacotes
# Depois de adicionar:
git add package.json package-lock.json
git commit -m "Add express"
git pushCenário 3: Pull Request Review
# Baixar PR para testar
git fetch origin pull/123/head:pr-123
git checkout pr-123
# Use npm ci (garante deps exatas do PR)
npm ci
npm run build
npm run testCenário 4: Deploy automatizado
# Script de deploy
#!/bin/bash
set -e
echo "Deploying to production..."
# 1. Pull latest
git pull origin main
# 2. Install dependencies (USE npm ci!)
npm ci --only=production # Só produção, mais rápido
# 3. Build
npm run build
# 4. Restart
pm2 restart appCenário 5: Dockerfile otimizado
FROM node:20-alpine
WORKDIR /app
# Copiar package files
COPY package*.json ./
# USE npm ci no Docker!
RUN npm ci --only=production
# Copiar código
COPY . .
# Build
RUN npm run build
CMD ["npm", "start"]Cenário 6: GitHub Actions
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 20
cache: 'npm' # Cache do npm ci
- name: Install dependencies
run: npm ci # SEMPRE use npm ci aqui!
- name: Type check
run: npm run type-check
- name: Lint
run: npm run lint
- name: Build
run: npm run build
- name: Test
run: npm run test⚠️ Problemas Comuns e Soluções
Problema 1: npm ci falha com "no such file package-lock.json"
# Erro:
npm ci
# Error: The package-lock.json file is missing
# Causa: package-lock.json não está commitado
# Solução:
npm install # Cria o lock
git add package-lock.json
git commit -m "Add package-lock.json"Prevenção:
# NÃO adicione isto no .gitignore!
# package-lock.json ❌ NUNCA!
# Sempre commite o package-lock.jsonProblema 2: "Funciona na minha máquina, mas não no CI"
# Dev:
npm install # Instala versão 15.0.5
# CI:
npm ci # Instala versão 15.0.3 (do lock antigo)
# Problema: Versões diferentes!
# Solução: Sempre commit o lock atualizado
npm install # Atualiza lock
git add package-lock.json
git commit -m "Update dependencies"
git pushProblema 3: npm ci está lento
# npm ci deveria ser mais rápido, mas está lento?
# Causa 1: Cache desativado
npm config get cache
# Se vazio, configurar:
npm config set cache ~/.npm --global
# Causa 2: node_modules muito grande
# npm ci remove antes de instalar, pode demorar
# Solução: Limpar antes
rm -rf node_modules
npm ciProblema 4: Conflito entre package.json e lock
npm ci
# Error: The package-lock.json was created for a different version
# Causa: package.json mudou mas lock não foi atualizado
# Solução:
npm install # Atualiza o lock
npm ci # Agora funciona🎯 Regras de Decisão
Use npm install quando:
# ✅ Adicionar/remover pacotes
npm install express
npm uninstall lodash
# ✅ Atualizar dependências
npm update
npm install react@latest
# ✅ Primeiro setup (criar lock)
npm install
# ✅ Desenvolvimento local ativo
npm installUse npm ci quando:
# ✅ CI/CD (SEMPRE!)
npm ci
# ✅ Produção (SEMPRE!)
npm ci --only=production
# ✅ Após clonar repositório
git clone ... && npm ci
# ✅ Após git pull
git pull && npm ci
# ✅ Testes automatizados
npm ci && npm test
# ✅ Docker builds
RUN npm ci
# ✅ Garantir reprodutibilidade
npm ci📈 Performance Benchmark
Projeto médio (100 deps):
# Primeira instalação
npm install # ~25 segundos
npm ci # ~15 segundos (40% mais rápido!)
# Instalação com cache
npm install # ~10 segundos
npm ci # ~5 segundos (50% mais rápido!)
# Com node_modules existente
npm install # ~8 segundos (apenas updates)
npm ci # ~15 segundos (remove tudo antes)Conclusão:
npm cié mais rápido quando não hánode_modulesnpm installpode ser mais rápido senode_modulesjá existe
🛠️ Comandos úteis relacionados
# Ver o que seria instalado (sem instalar)
npm install --dry-run
# Instalar apenas produção
npm ci --only=production
npm install --production
# Forçar reinstalação completa
rm -rf node_modules package-lock.json
npm install
# Ver diferenças entre package.json e lock
npm ls --depth=0
# Verificar integridade do lock
npm audit
# Limpar cache antes de instalar
npm cache clean --force
npm ci🎨 Scripts Recomendados
Adicione ao seu package.json:
{
"scripts": {
"install:ci": "npm ci",
"install:fresh": "rm -rf node_modules package-lock.json && npm install",
"install:prod": "npm ci --only=production",
"postinstall": "echo 'Dependencies installed successfully!'",
"preinstall": "node -v && npm -v"
}
}✅ Checklist Final
Para Desenvolvimento:
- Use
npm installpara adicionar deps - Commite
package-lock.jsonsempre - Use
npm ciapósgit pull - Não ignore
package-lock.jsonno git
Para CI/CD:
- SEMPRE use
npm ci - Ative cache do npm
- Use
--only=productionse possível - Falhe o build se
npm cifalhar
Para Produção:
- SEMPRE use
npm ci --only=production - Nunca use
npm installem produção - Verifique package-lock.json antes do deploy
- Mantenha Node.js atualizado
📚 Resumo Visual
| npm install | npm ci |
|---|---|
| 📝 Desenvolvimento | 🚀 CI/CD |
| ➕ Adicionar deps | ✅ Produção |
| 🔄 Atualizar deps | 🔒 Reprodução |
| 🎨 Criar lock | ⚡ Performance |
🎓 Resumo Executivo
Para 99% dos casos:
- Desenvolvimento local:
npm install - CI/CD e Produção:
npm ci - Após git pull:
npm ci - Adicionar deps:
npm install <package> - Problemas:
rm -rf node_modules && npm ci
Regra de ouro:
- Se você vai modificar dependências →
npm install - Se você vai instalar dependências →
npm ci