Azure SDKのNoWarn移行とは?inline suppressionsへの変更点と確認ポイント

Azure SDKの「Migrate NoWarn to inline suppressions for 10 projects」は、SDK利用者向けのAPI変更ではなく、Azure SDK for .NETリポジトリ内で警告抑制の方法を整理するメンテナンス変更です。結論から言うと、NuGetでAzure SDKを利用しているだけの開発者は、基本的に直接対応する必要はありません。一方で、Azure SDKへコントリビュートしている人、forkを保守している人、自社の.NETライブラリで<NoWarn>を多用している人は、今回の変更方針を確認しておく価値があります。

今回のポイントは、プロジェクトファイルの<NoWarn>で警告をまとめて隠すのではなく、実際に必要な場所だけに#pragma warning disableや[SuppressMessage]を置くことです。対象PRは当初「10 projects」として始まりましたが、その後「first batch」として整理され、37プロジェクト・7つのサービスディレクトリにまたがる変更として説明されています。PRタイトルも2026年5月5日に「Migrate NoWarn to inline suppressions first batch」へ変更されています。(GitHub)

目次

Azure SDKのNoWarn移行で何が変わったのか

今回のAzure SDK for .NETの変更は、各.csprojに書かれていた<NoWarn>を削除し、警告が本当に発生している箇所だけを狭い範囲で抑制するものです。PRの説明では、34個のcsprojファイルから<NoWarn>が削除され、3つの手書きコードにはインラインの#pragma warning disableが追加され、9つのGlobalSuppressions.csには生成コード向けの[SuppressMessage]が追加または更新されたとされています。(GitHub)

変更前変更後目的
.csprojの<NoWarn>で警告をプロジェクト単位で抑制不要な<NoWarn>は削除古い抑制設定を残さない
手書きコードの警告もプロジェクト全体で抑制対象クラスやメンバー付近で#pragma warning disableを使用抑制範囲を最小化する
生成コードの警告も<NoWarn>で抑制GlobalSuppressions.csに[SuppressMessage]を追加Generated/配下を直接編集せずに抑制する
過去に必要だった警告抑制を残したままにするビルドで実際に発生する警告だけを残すCIやレビューで不要な例外設定を減らす

MicrosoftのC#コンパイラオプションでは、NoWarnは1つ以上の警告を表示しないようにする設定です。つまり、便利ではあるものの、設定した警告がプロジェクト全体で見えなくなります。警告を特定箇所だけで抑制したい場合は、コード内で#pragma warningを使う方法が案内されています。(Microsoft Learn)

「10プロジェクト」から「Batch 1」へ広がった対象範囲

この変更は、最初のコミットでは「Migrate NoWarn to inline suppressions for 10 projects」として、Key Vault、Communication、Maps、DevCenter、Health Insights、Anomaly Detector、Confidential Ledger関連のプロジェクトが挙げられていました。その後、同じサービスディレクトリ内の残りの<NoWarn>も対象に加えられ、Batch 1として37プロジェクトに拡大されています。(GitHub)

PR本文で示されているサービスディレクトリごとの影響範囲は、次の通りです。

サービスディレクトリ対象プロジェクトの概要主な状況
keyvault5 src + 1 provisioningすべてstale、実際の警告なし
communication6 src + 1 test + 1 provisioningAZC0034、AZC0035が一部でlive
maps3 src + 6 testsAZC0035、AZC0012が一部でlive
devcenter1 src + 2 testsAZC0034がlive
healthinsights3 testsすべてstale
confidentialledger1 src + 1 testAZC0034、AZC0035が一部でlive
anomalydetector1 srcAZC0012がlive

ここでいうstaleは、過去には必要だった可能性があるものの、現在は削除しても警告が発生しない抑制設定を指します。関連Issueでは、Batch 1で約70%のNoWarnエントリがstaleだったこと、残り約200プロジェクトが今後の対象として残っていることも示されています。(GitHub)

誰が対応すべきか

この変更はAzure SDKの内部品質管理に近い内容です。すべてのAzure SDK利用者が作業する必要はありませんが、関わり方によって確認すべきポイントが変わります。

立場対応の必要性確認すべきこと
Azure SDKをアプリから利用している開発者低い通常はNuGetパッケージの利用方法に影響しない
Azure SDK for .NETへPRを出す開発者高い新規<NoWarn>追加ではなく、最小範囲の抑制を使う
Azure SDKのforkを保守しているチーム中〜高upstream取り込み時にGlobalSuppressions.csや#pragmaの差分を確認する
自社.NET SDKやライブラリの保守担当中自社リポジトリでもstaleな<NoWarn>が残っていないか確認する
CI/CDや品質ゲートの担当者中TreatWarningsAsErrors環境で警告抑制削除がビルド失敗につながらないか確認する

特に注意したいのは、Azure SDKリポジトリでは警告がエラーとして扱われる前提がある点です。関連Issueでは、TreatWarningsAsErrors=trueにより、NoWarnを削除すると実際に残っている警告がビルドエラーとして表面化すると説明されています。(GitHub)

NoWarnを減らすべき理由

<NoWarn>は、短期的にはビルドを通すために便利です。しかし、長期運用では次のような問題が起きやすくなります。

問題実務で起きること結果
抑制範囲が広すぎる1つの警告を避けるために、同じ警告コード全体が見えなくなる新しい問題を検知しにくくなる
staleな設定が残る既に修正済みの警告コードがcsprojに残り続けるレビュー時に本当に必要な抑制か判断しづらい
抑制理由がコードから離れる.csprojだけを見ても、どの型・メンバーのための抑制か分からない保守担当者が削除可否を判断できない
CIとローカルで見え方が変わるターゲットフレームワークやAnalyzerの差で警告が出たり出なかったりするリリース直前にビルド失敗が起きる

Microsoftのドキュメントでも、SuppressMessageAttributeはソースファイルやGlobalSuppressions.csで、プロジェクトやファイルの特定部分に対して警告を抑制する方法として説明されています。プロジェクト全体で黙らせるより、抑制対象をコードに近づけるほうが、後から理由を追いやすくなります。(Microsoft Learn)

移行時の判断基準

Azure SDKの関連Issueでは、抑制の優先順位として「可能なら根本原因を修正する」「手書きコードでは#pragma warning disableを使う」「生成コードではGlobalSuppressions.csを使う」という方針が示されています。(GitHub)

実務では、次の順番で判断すると迷いにくくなります。

状況推奨対応理由
ドキュメント不足、ヘッダー不足など簡単に直せる警告コードやコメントを修正する抑制より修正のほうが安全
既に警告が出ていない<NoWarn>を削除するstaleな設定を減らせる
手書きコードの特定クラスだけで警告が出るクラスやメンバー付近に#pragma warning disableを置く影響範囲を最小化できる
生成コードで警告が出るGlobalSuppressions.csに[SuppressMessage]を追加する生成ファイルを直接編集せずに済む
型名変更などが破壊的変更になり得る根本修正ではなく、理由付きで抑制するSDKの互換性を守る必要がある
共有propsで広く抑制している本当に全体抑制が必要か見直す将来の警告を隠すリスクがある

ポイントは、警告を消すことではなく、警告を見える状態に戻したうえで、例外だけを説明可能にすることです。

自社リポジトリで確認する手順

Azure SDKの変更をそのまま自社プロジェクトに適用する場合は、いきなり全削除するのではなく、サービス単位やプロジェクト単位で進めるのが安全です。

| 手順 | 作業内容 | 確認ポイント |
| -: | ———————— | —————————————————————- |
| 1 | <NoWarn>の使用箇所を洗い出す | .csproj、Directory.Build.props、Directory.Build.targetsを確認する |
| 2 | 対象コードごとに削除候補を決める | まずは影響範囲の小さいプロジェクトから始める |
| 3 | <NoWarn>を一時的に削除してビルドする | 警告が出なければstaleとして削除できる |
| 4 | liveな警告を分類する | 手書きコードか、生成コードか、修正可能かを見る |
| 5 | 必要最小限の抑制を追加する | #pragmaまたはGlobalSuppressions.csを使い分ける |
| 6 | 抑制理由を残す | 将来のレビューで削除可否を判断できるようにする |
| 7 | CIで再ビルドする | ローカルだけでなく、複数ターゲットやAnalyzer差分も確認する |

検索には、例えば次のようなコマンドが使えます。

git grep -n "<NoWarn>" -- "*.csproj" "*Directory.Build*.props" "*Directory.Build*.targets"

<NoWarn>を削除した後にビルドが通るなら、その抑制は現在不要になっている可能性があります。逆にビルドが失敗する場合は、警告がまだ生きているため、修正するか、より狭い範囲で抑制します。

Before/Afterで見る移行イメージ

変更前は、プロジェクトファイルに警告コードをまとめて書く形です。

<PropertyGroup>
  <NoWarn>$(NoWarn);AZC0035</NoWarn>
</PropertyGroup>

この書き方では、AZC0035がどの型のために必要なのか、プロジェクトファイルだけでは分かりません。将来、別の型で同じ警告が出ても見逃す可能性があります。

手書きコードで特定の型だけを抑制する場合は、次のように対象付近へ寄せます。

#pragma warning disable AZC0035 // 既存API互換性を維持するため、この型ではモデルファクトリ警告を抑制する
public partial class ExampleResult
{
    // 既存実装
}
#pragma warning restore AZC0035

生成コードで警告が出る場合は、生成ファイルを直接編集せず、GlobalSuppressions.csで管理します。

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage(
    "Usage",
    "AZC0035: Missing model factory method",
    Justification = "Generated code. The Generated directory is not edited directly.",
    Scope = "type",
    Target = "~T:Azure.Example.GeneratedExampleResult")]

実際のCategory、CheckId、Scope、Targetは、Analyzerの出力や既存の抑制形式に合わせて設定します。SuppressMessageAttributeにはカテゴリやルールID、正当化理由、対象範囲などのプロパティがあり、どこに対する抑制なのかを明示できます。(Microsoft Learn)

失敗しやすいポイント

<NoWarn>を消すだけで終わらせる

staleな警告なら削除だけで問題ありません。しかし、liveな警告まで削除すると、TreatWarningsAsErrors環境ではビルドエラーになります。削除後に必ずビルドし、残った警告を分類する必要があります。

生成コードに直接#pragmaを入れる

生成コードは再生成で上書きされる可能性があります。Azure SDKのPRでも、生成コードの警告にはGlobalSuppressions.csを使い、手書きコードには#pragma warning disableを使う方針が示されています。(GitHub)

#pragma warning restoreを忘れる

#pragma warning disableだけを書いてrestoreを忘れると、意図した範囲を超えて警告が抑制されることがあります。クラス単位やメンバー単位で使う場合でも、抑制の終わりを明確にしておくとレビューしやすくなります。

削除した<NoWarn>のコメントだけが残る

今回のPRでは、削除されたNoWarnに紐づく孤立コメントや末尾改行の整備も行われています。機能変更ではない小さな差分に見えますが、保守性を上げるうえでは重要です。(GitHub)

抑制理由を書かない

[SuppressMessage]や#pragmaは、理由がないと将来の担当者が削除してよいか判断できません。特に「互換性維持のため」「生成コードのため」「Analyzerの既知の誤検知のため」のように、なぜ修正ではなく抑制を選んだのかを短く残すことが大切です。

Azure SDK関連PRとして確認すべき点

このPRは、記事執筆時点でDraftとして表示されています。つまり、Azure SDKの利用者向けにリリースされた仕様変更というより、リポジトリ内の開発品質を整える作業として見るべきです。PRはIssue #58243「Move all existing NoWarn to inline suppressions」の一部であり、Batch 1の後にも残りのプロジェクトが続く可能性があります。(GitHub)

Azure SDK for .NETの変更を追う場合は、次の順に確認すると誤解を避けられます。

確認項目見るべきポイント
PRの状態Draftか、Ready for reviewか、merge済みか
Files changed自分が関わるサービスディレクトリが含まれているか
関連IssueBatch全体の方針や残作業が説明されているか
変更内容API変更なのか、ビルド・Analyzer・品質管理の変更なのか
CI結果NoWarn削除後に警告がエラー化していないか

特に、PR名だけを見ると「10プロジェクトの移行」に見えますが、現在の説明ではBatch 1として37プロジェクトに広がっています。古いコミット名やタイトルだけで判断せず、PR本文と関連Issueを合わせて確認することが重要です。

まとめ:Azure SDKのNoWarn移行は「警告を隠す」から「理由付きで管理する」への変更

Azure SDKの「Migrate NoWarn to inline suppressions」は、エンドユーザー向けの機能追加ではなく、Azure SDK for .NETの警告抑制を整理するための変更です。NuGetでAzure SDKを使っているだけなら、通常は対応不要です。

一方で、Azure SDKへコントリビュートする開発者や、自社.NETライブラリで<NoWarn>を多用しているチームにとっては、実務上かなり参考になる変更です。まずは自分のリポジトリで<NoWarn>を検索し、削除しても警告が出ないstaleな設定を減らしましょう。警告が残る場合は、根本修正を優先し、それが難しいときだけ#pragma warning disableやGlobalSuppressions.csで最小範囲に抑制します。

次に取るべき行動はシンプルです。<NoWarn>の棚卸しを行い、「本当に必要な抑制か」「どのコードのための抑制か」「理由がレビューできる形で残っているか」を確認してください。それだけで、CIの信頼性とコードレビューの見通しは大きく改善します。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次