Se você está acompanhando a polêmica ao redor do ambiente Node.js e NPM em 2024, você provavelmente já deve saber sobre o que eu vou falar. Mas hoje, quero mostrar pra você o que é o Corepack, a ferramenta que promete acabar com a guerra entre os gerenciadores de pacotes do Node!

Mas primeiro, um pouco de história!

Sobre o NPM

Desde que o Node foi criado, o NPM sempre foi o gerenciador de pacotes principal. Sendo embutido diretamente no binário do runtime e permitindo que você instalasse pacotes de forma muito simples e fácil.

Existem teorias dizendo que o criador do NPM, Isaac Schlueter, forçou a adoção do NPM pelo Node, de certa forma coagindo o pessoal a incluir ele no binário. O que não é verdade, o NPM foi um acordo entre ambos Isaac e Ryan Dahl para suprir a necessidade de uma comunidade crescente de usuários, a de ter uma forma simples de instalar pacotes externos.

Por muitos anos, o NPM foi o único local onde você podia publicar e baixar pacotes para o Node.js, isso não é mais verdade desde que tivemos o advento de outros como Yarn e PNPM – que eu inclusive fiz um vídeo para cobrir:

Então o NPM foi incluso no Node mesmo antes de ele se tornar uma corporação lucrativa comprada pelo GitHub em 2020 e, quando o GitHub foi comprado pela Microsoft, incluída no catálogo deles também.

O que se tirou disso é que, desde 2009, o NPM tem a maior fatia do mercado de managers, não que isso signifique alguma coisa prática, porém, tendo praticamente o monopólio de como os pacotes são baixados e utilizados, o NPM praticamente ditava como os pacotes precisavam ser criados, inclusive muitas das funcionalidades do Node foram criadas com ele em mente como, por exemplo, o fato de que qualquer pacote que não tenha um prefixo vai, automaticamente, ter o gerenciador setado para o NPM.

Vem aprender comigo!

Quer aprender mais sobre criptografia e boas práticas com #TypeScript?

Se inscreva na Formação TS!

Esse acoplamento próximo do Node permitiu que o NPM ganhasse uma vantagem quase impeditiva para qualquer outro package manager florescer, basicamente muita gente viu isso como uma forma de eliminação de concorrência, como essa talk da CJ Silverio (ex CTO do NPM) mostra:

Mas e agora? Como ficam os demais gerenciadores? O fato é que, quando o NPM se tornou quase inutilizável devido à demora de instalação de pacotes, outras pessoas se moveram para criar outros gerenciadores, como o Yarn e o pnpm. A partir daí começou a guerra dos gerenciadores de pacotes. Uma guerra que, assim como a dos browsers, tinha e tem um monopólio grande de um sistema já estabelecido.

Mas isso tudo pode mudar com o Corepack.

O que é o Corepack

O Corepack é uma ferramenta que agora já vem junto ao Node.js desde a versão 14.19, assim como o NPM, mas ao invés de ser um package manager, ele é todos os package managers.

Essa ferramenta permite que você não só escolha um package manager que você queira, como também permite que você instale qualquer um deles sem precisar ir pelo longo processo de baixar o binário e instalar globalmente, etc... Basta rodar:

corepack enable && corepack enable npm

Esse comando ativa o Corepack para todos os pacotes do seu sistema, globalmente. O mesmo vale para o Yarn e pnpm. Ou seja, o Corepack é uma forma de você utilizar qualquer package manager que você ou o seu projeto estejam utilizando no momento, e ainda dizer para pessoas que vão utilizar o seu projeto qual é o package manager preferido (ou obrigatório).

🤖
Como você pode imaginar, a reação do NPM a essa ferramente não poderia ter sido outra, eles foram veementemente contra adotarem o protocolo, porque isso significaria também que o NPM iria parar de ser embutido no binário do Node.

Como usar o Corepack

Para utilizar o Corepack é bastante simples, vá no seu arquivo package.json e crie uma nova chave chamada packageManager, essa chave precisa ter o valor de yarn, npm ou pnpm, porém não qualquer valor, você também precisa especificar uma versão para o pacote:

{
  // npm
  "packageManager": "npm@10.8.1",
  // pnpm
  "packageManager": "pnpm@9.1.4",
  // yarn
  "packageManager": "yarn@3.1.1"
}

Você não pode usar notações como pnpm@latest ou yarn@^10.0.0 (nem omitir a versão como pnpm diretamente). Mas ai que a mágica acontece.

Se você tiver um pacote ou projeto com a seguinte configuração no seu package.json:

{
  "packageManager": "pnpm@9.1.4"
}

E tentar rodar npm install, você vai ter um erro dizendo:

Usage Error: This project is configured to use pnpm

Agora, se você digitar pnpm install, você vai ter uma outra mensagem:

Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-9.1.4.tgz.

Do you want to continue? [Y/n]

E o mesmo vale para o Yarn.

O que o Corepack faz é interceptar chamadas para o Yarn e o pnpm, mas ele não faz o mesmo para o NPM, por isso precisamos de corepack enable npm, para que ele também intercepte as chamadas do NPM e faça a mesma coisa.

Agora você pode usar qualquer package manager, em qualquer repositório, a qualquer momento.

Conclusão

Enquanto essa é uma espécie de vitória para a comunidade em ter mais opções de forma mais justa, vale ressaltar que o NPM é uma das maiores ferramentas e provavelmente uma das principais razões pela qual o Node é o que é.

Então temos que ser gratos a eles também por ter feito todo esse trabalho desde 2009 e ter mantido tão bem a comunidade e a gestão de pacotes para que todos os usuários pudessem prosperar em um ambiente muito mais fácil e mais intuitivo.

Além disso, é importante dizer que, ao embutir o NPM dentro do Node, a gente ganha algumas coisas. Uma delas, se não a principal, é o fato de que a gente sabe que a versão atual do Node sempre vai funcionar com a versão instalada do NPM, isso facilita muito na hora de fazermos a gestão dos pacotes, porém é um problema maior para o time do Node já que uma nova versão tem que ser sincronizada entre os dois binários.

Por outro lado, usar sempre o Corepack da forma como ele é, não é muito intuitiva, portanto desacoplar o NPM por padrão pode tornar a vida de quem está querendo só instalar ou utilizar um pacote do Node bem mais complicada, por isso que essa polêmica não é tão simples assim!