Dotnet watch rodando no Ubuntu Linux e WSL2

Se você, assim como eu, gosta de codar rodando os seus testes em paralelo, deve ter ficado muito triste quando percebeu que o dotnet watch não funcionou corretamente. Ele simplesmente não consegue capturar as alterações feitas nos arquivos do projeto. A princípio eu pensei que fosse apenas uma condição do WSL. Porém, quando instalei o ubuntu no meu notebook, percebi que era realmente alguma coisa ligada ao sistema operacional. Procurei bastante na internet e descobri o que poderia ser. Aqui eu te conto o que acontece e como resolver. Continue a leitura para descobrir como rodar o dotnet watch no Ubuntu Linux e no WSL2.

O que acontece?

Eu preciso começar dizendo que não sou especialista em Linux e nem em sistemas operacionais. Mas o problema parece ser simples. Você já deve ter percebido que o dotnet watch só consegue “vigiar as alterações” dos arquivos que já tenham feito parte de uma compilação. Isso pra mim diz que, toda vez que ele roda o comando, ele passa a “vigiar” esses arquivos, aguardando por modificações.

Claramente temos aí a aplicação de um pattern já conhecido nosso. O observable. Basicamente, o dotnet watch solicita notificações para os arquivos presentes na compilação. E é justamente aí que reside o problema. No Windows tudo funciona ok, mas no Linux não. E tem um motivo: o sistema impões limites para a quantidade de arquivos que uma aplicação pode pedir por notificações. No Ubuntu 21, o meu limite estava setado em 128 arquivos.

Logo, fica fácil entender o que precisamos fazer: aumentar esse limite. Mas não apenas isso! Também é necessário ligar o pool do FileSystemWatcher – uma configuração que o dotnet watch utiliza para fazer a leitura do estado dos arquivos.

Como resolver

Nós vamos alterar arquivos. Então, a primeira coisa é: faça backup!

Para aumentar a quantidade de arquivos, basta você rodar o comando:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Como eu disse antes, faça backup do arquivo /etc/sysctl.conf antes de rodar o comando. Outra coisa que é importante fazer é, caso o arquivo já exista, verifique se ele já tem a configuração especificada. Outros programas fazem uso dessa configuração (onedrive e afins) e podem já ter feito essa modificação durante a sua instalação. Se a configuração já existir… Bom, use o número de arquivos que você achar que deve 🙂

Outra alteração que você precisa fazer no seu ambiente é rodar o comando:

export DOTNET_USE_POLLING_FILE_WATCHER=true 

Com essa linha de comando, você está alterando uma configuração do dotnet watch. É importante que ela sempre rode quando o seu sistema estiver no ar. Para isso, você pode adicioná-la ao arquivo ~/.bashrc ou ~/.zshrc (caso esteja usando o zsh como shell). Existem outras formas também, mas aí é com você. Como eu disse, sou iniciante no Linux.

Caso você faça essa alterações nos arquivos rc, para que não seja necessário reiniciar o computador, rode o comando (no meu caso, estou utilizando o zsh):

source ~/.zshrc

Dando crédito

Escrevo esse drops para atender as pessoas de fala portuguesa e também para que eu não esqueça esse conteúdo. Mas preciso dizer que a “descoberta” foi encontrada em outro blog, e você pode clicar aqui para acessá-lo. Tem bastante conteúdo em inglês lá. Não conferi tudo, mas parece bastante interessante.

Até a próxima!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.