Start Debugging

TreatWarningsAsErrors без саботажа dev-сборок (.NET 10)

Как обеспечить TreatWarningsAsErrors в сборках Release и CI, оставив Debug гибким для локальной разработки на .NET 10, с помощью Directory.Build.props.

Если вы хоть раз переключали TreatWarningsAsErrors в true и тут же об этом жалели, вы не одиноки. Недавняя ветка на r/dotnet, которая ходит по сети, предлагает простую правку: требовать кода без warning’ов в Release (и в CI), но оставить Debug гибким для локальных экспериментов: https://www.reddit.com/r/dotnet/comments/1qjum3h/treating_warnings_as_errors_in_dotnet_the_right/

Принудительное соблюдение только для Release это политика, а не переключатель

То, чего вы реально хотите добиться, это рабочий процесс:

В репозиториях на .NET 10 самое аккуратное место централизовать это Directory.Build.props. Так правило применяется к каждому проекту, включая тестовые, без copy/paste.

Минимальный шаблон:

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

Это совпадает с тем, что большинство CI-пайплайнов и так собирают (Release). Если ваш CI собирает Debug, переключите его сначала на Release. Тогда ваша планка “без warning’ов” совпадёт с теми бинарями, которые вы выпускаете.

Быть строгим не значит быть слепым

После активации большого переключателя важны две настройки:

Пример: ужесточаем один warning, остальные оставляем как warning’и:

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

И если нужно временно подавить шумный анализатор в одном проекте:

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

Если вы используете Roslyn-анализаторы (что обычно для современных решений на .NET 10), обратите внимание и на .editorconfig для управления severity, потому что он легко обнаруживается и держит политику рядом с кодом:

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

Практическая отдача для PR

Реальный выигрыш это предсказуемый фидбек на PR. Разработчики быстро усваивают, что warning’и это не “работа на потом”, а часть definition of done для Release. Debug остаётся быстрым и снисходительным, Release остаётся строгим и готовым к выпуску.

Если хотите оригинальный источник этого паттерна (и тот крошечный сниппет, с которого пошло обсуждение), смотрите ветку здесь: 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.

< Назад