pnpm vs Yarn: Qual Gerenciador de Pacotes para CI?
Ambos são alternativas modernas ao npm, mas o pnpm e o Yarn fazem trade-offs diferentes em disco, rigor e workspaces.
O pnpm usa um store endereçado por conteúdo com node_modules por symlinks. O Yarn (Classic ou o mais novo Berry) oferece instalações rápidas, workspaces e o opcional Plug'n'Play. No CI a diferença aparece no uso de disco e no comportamento do cache.
| pnpm | Yarn | |
|---|---|---|
| Layout do node_modules | Store endereçado por conteúdo via symlinks | Flat (Classic) ou PnP (Berry) |
| Uso de disco | Baixo (store compartilhado) | Maior (Classic), baixo (PnP) |
| Rigor | Estrito (sem deps fantasma) | Frouxo (Classic), estrito (PnP) |
| Install no CI | pnpm i --frozen-lockfile | yarn install --immutable |
| Workspaces de monorepo | Forte | Forte |
No CI
O pnpm tende a vencer em disco e na velocidade de install com store quente, e sua resolução estrita pega bugs de dependência fantasma antes que cheguem à produção. O Yarn Berry com PnP também pode ser extremamente rápido e enxuto, mas o PnP muda a resolução de módulos de formas que alguns pacotes não esperam, então teste sua árvore de dependências. O Yarn Classic é o drop-in de menor atrito se você já o usa.
Cacheie o store
Para o pnpm, cacheie o diretório do store (pnpm store path) com chave em pnpm-lock.yaml. Para o Yarn, cacheie a pasta de cache do Yarn com chave em yarn.lock. Cachear o store importa mais para o tempo de relógio do que a escolha da ferramenta em si.
O veredito
Quer pouco disco e resolução estrita: pnpm. Quer um drop-in rápido ou o modelo zero-install do PnP e já está no Yarn: Yarn. Faça commit do lockfile e cacheie o store em qualquer um.