Plugins do Yarn 2: uma introdução
13 de abril de 2020
0 minutos de leituraSe você tem curiosidade sobre o Yarn 2 e sua arquitetura de plugins, um bom ponto de partida é ler a página da documentação sobre essa arquitetura em yarnpkg.com e acompanhar o tutorial de plugins do Yarn 2 no site.
Se você está começando a usar o Yarn 2, recomendo muito a leitura da minha publicação Introdução ao Yarn 2.
Criando um plugin para o Yarn 2
Vamos começar configurando um ambiente para criar o plugin. Primeiro, criaremos um novo projeto gerenciado pelo Yarn 2:
Com isso, temos um projeto de pacote npm limpo, gerenciado pelo Yarn 2.
Para informar ao Yarn que queremos chamar um plugin durante a execução do processo, vamos criar um arquivo chamado .yarnrc.yml e adicionar a definição do plugin com o caminho até o código que vamos desenvolver:
Agora, vamos ao código do plugin. Vamos criar algo que se conecte à etapa pela qual o Yarn passa, chamada afterAllInstalled, e, em seguida, imprima uma mensagem no console. O código do plugin ficará assim:
Para testar o plugin, basta executar o comando yarn na CLI. Ele deverá imprimir o seguinte:
Muito legal: agora temos nosso próprio plugin do Yarn 2!
Os plugins do Yarn 2 podem fazer muitas coisas: adicionar comandos ao executável yarn, criar novos resolvers ou fetchers, como o Yarn os chama, e até conectar plugins do yarn entre si!
Se quiser aprender a criar um plugin do Yarn 2 que adiciona comandos ao Yarn, acesse a documentação oficial de plugins do Yarn, que mostra como fazer isso.
Usando um plugin do Yarn 2 para acessar informações detalhadas sobre dependências
Como vimos no exemplo anterior, alguns hooks do Yarn nos permitem uma integração mais próxima, disponibilizando um objeto público global com metadados detalhados que o Yarn coleta sobre o projeto.
No exemplo a seguir, vamos nos integrar novamente ao hook afterAllInstalled, que
é chamado com um parâmetro adicional: o objeto público Project. Com esse parâmetro extra, podemos acessar todas as informações que o Yarn coletou sobre o projeto: dependências, manifesto do pacote, informações sobre workspaces e muito mais.
No exemplo de plugin plugin-hook-install-hello-brave-world.js a seguir, capturamos as informações desse objeto na variável _ e gravamos seu conteúdo em um arquivo JSON para inspecioná-lo melhor:
A estrutura do objeto Project é definida em packages/berry-core/sources/Project.ts. Veja a seguir uma lista parcial das chaves no nível raiz do objeto:
Essas chaves stored* vão nos ajudar a entender as dependências e montar a árvore deste projeto.
Para simplificar, vamos executar este plugin em um projeto npm com apenas uma dependência: debug. Por sua vez, debug também depende de ms.
O objeto storedPackages é nosso ponto de partida para obter a lista de dependências do projeto. Observe que ele também inclui uma entrada com o nome do próprio projeto, identificada pela referência workspace: key.
Vamos ver como a dependência debug aparece no Map storedPackages:
A entrada de debug tem um hash exclusivo para identificá-la, alguns metadados, como a versão resolvida, e outro objeto aninhado de dependências, que lista as dependências de debug. Mas você vai notar que ms, que aparece no objeto de dependências aninhado, ainda não foi resolvido e está indicado apenas por um intervalo de versões.
Para resolver as dependências aninhadas, precisamos usar descriptorHash e consultar o Map storedResolutions, que tem a seguinte estrutura:
Encontramos o descriptorHash de ms, 0742408cf974a8f1cd5081a9aec19656dc8016eec3c6e2358f302902e6f1f87241f601911cb45e855f3b0d26160c1520715ae79904c5ed1d29f5383ab906440e, como o terceiro elemento em storedResolutions. Ele aponta para o hash 9455a02525b0e2c50eca4e204d71900a775107249d4245c1ea1f95e3f124c8a1d27484b29ccea934895da4d0273b22dc95cefd0561c39490cd7c86ab4404ca33, que, por sua vez, aponta para uma entrada de dependência no Map storedPackages. Dessa vez, porém, são os metadados da dependência ms já totalmente resolvida:
Resumo: plugins do Yarn 2
O Yarn 2 ainda é recente e está conquistando usuários e recebendo feedback da comunidade. Por isso, este é um ótimo momento para criar plugins.
Comece a resolver desafios de capture the flag
Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.



