Start Debugging

TreatWarningsAsErrors sem sabotar os builds de dev (.NET 10)

Como aplicar TreatWarningsAsErrors em builds Release e em CI mantendo Debug flexível para o desenvolvimento local no .NET 10, usando Directory.Build.props.

Se você já ligou TreatWarningsAsErrors para true e se arrependeu na mesma hora, você não está sozinho. Uma thread recente no r/dotnet que está circulando sugere um ajuste simples: forçar código sem warnings no Release (e no CI), mas manter Debug flexível para exploração local: https://www.reddit.com/r/dotnet/comments/1qjum3h/treating_warnings_as_errors_in_dotnet_the_right/

Forçar só em Release é uma política, não um interruptor

O que você está tentando atingir é um fluxo de trabalho:

Em repositórios .NET 10, o lugar mais limpo para centralizar isso é Directory.Build.props. Isso faz a regra valer em cada projeto, incluindo projetos de teste, sem copy/paste.

Aqui está um padrão mínimo:

<!-- Directory.Build.props -->
<Project>
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  </PropertyGroup>
</Project>

Isso bate com o que a maioria dos pipelines de CI compila de qualquer jeito (Release). Se o seu CI compila Debug, mude pra Release primeiro. Assim o seu padrão de “sem warnings” combina com os binários que você entrega.

Ser estrito não significa ser cego

Dois botões importam quando você liga o interruptor grande:

Exemplo apertando um warning enquanto deixa os demais como warnings:

<Project>
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
    <WarningsAsErrors>$(WarningsAsErrors);CS8602</WarningsAsErrors>
  </PropertyGroup>
</Project>

E se você precisa suprimir temporariamente um analisador barulhento em um projeto:

<Project>
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <NoWarn>$(NoWarn);CA2007</NoWarn>
  </PropertyGroup>
</Project>

Se você usa Roslyn analyzers (comum em soluções modernas .NET 10), considere também .editorconfig para controlar severidade, porque é descobrível e mantém a política perto do código:

# .editorconfig
[*.cs]
dotnet_diagnostic.CA2007.severity = warning

O ganho prático para os PRs

O ganho real é feedback previsível nos PRs. Desenvolvedores aprendem rápido que warnings não são “trabalho futuro”, são parte da definition of done do Release. Debug fica rápido e tolerante, Release fica estrito e pronto pra entrega.

Se você quer o gatilho original desse padrão (e o pequeno snippet que iniciou a discussão), veja a thread aqui: https://www.reddit.com/r/dotnet/comments/1qjum3h/treating_warnings_as_errors_in_dotnet_the_right/

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar