DEV Community

Ricardo Mello
Ricardo Mello

Posted on

Commitar ou não commitar o package-lock.json?

Commitar ou não commitar?

Versão resumida:

  1. Sim, você deve commitar
  2. Sempre faça o commit do arquivo quando ele for alterado
  3. Nunca delete o package-lock.json e nem coloque ele no .gitignore
  4. O mesmo vale para o yarn.lock

Contexto

Ainda hoje eu vejo muita gente discutindo sobre porque não commitar o package-lock. Rola um misticismo danado em cima desse arquivo tão útil e hoje vamos entender se vale a pena ou usar.

Os problemas

Tem sido cada vez mais raro, mas ainda acontece: aquela dependência que você adicionou no package.json e colocou a versão com um circunflexo (Ex.: "typescript": "^4.0.0") atualizou pra versão 4.9 e sua aplicação começou a quebrar.

Isso acontece porque você permitiu o update da major pra essa dependência, permitindo a atualização de novas features. O problema é que um código que o desenvolvedor considera como feature, pode se tornar uma breaking change pra você.

Daí você pode ser malandro e tirar o circunflexo pra travar a versão, mas você sabia que a dependência da sua dependência também pode ter o tal circunflexo?

Outro caso acontece quando você desenvolve a sua feature, commita o seu código, e na hora do CI o build vai lá e quebra, mas local ele roda normalmente.

Ou pior, a versão de produção começa a apresentar um bug estranho que só acontece em produção, e depois de horas investigando você descobre que é a versão da lib que tá diferente.

Na minha máquina funciona

A solução: package-lock.json

Todos esses problemas poderiam ter sido evitados com o package-lock.json. O lock, como seu próprio nome diz, é uma espécie de trava que descreve toda a árvore de dependências geradas pelo npm install e garante que todas as pessoas do projeto, incluindo o seu CI, vão instalar as mesmas dependências e suas respectivas versões.

Como cada commit tem seu snapshot do package-lock, você consegue voltar pra uma versão anterior da aplicação e reinstalar toda a árvore de dependências que funcionava quando o snapshot foi criado.

O package-lock.json também indica quando uma dependência foi atualizada, te dando uma ótima visibilidade da árvore de dependências do seu projeto.

Pra galera do yarn: yarn.lock

E se você usa o yarn, isso também vale pra você. O yarn.lock tem a mesma funcionalidade do package-lock.json e também deve ser versionado.

Top comments (0)