Durable Task Roslyn Analyzer for C# オーケストレーション

Durable Task Roslyn Analyzer は、C# Durable Functions アプリの orchestrator コード制約に従うのに役立つライブ コード アナライザーです。 コードが運用環境に到達する前に、非決定論的 API の使用、不適切なバインディング、ビルド時の型の不一致などの一般的な問題が検出されます。

アナライザーは、Microsoft.Azure.Functions.Worker.Extensions.DurableTask NuGet パッケージ (v1.6.0 以降) にバンドルされており、既定で有効になっています。 追加のセットアップは必要ありません。

Durable Task Roslyn Analyzer は、C# Durable Task SDK アプリで オーケストレーター コードの制約 に従うのに役立つライブ コード アナライザーです。 コードが運用環境に到達する前に、ビルド時の非決定論的 API の使用や型の不一致などの一般的な問題を検出します。

アナライザーを使用するには、 Microsoft.DurableTask.Analyzers NuGet パッケージをプロジェクトに追加します。

dotnet add package Microsoft.DurableTask.Analyzers

どのように機能するのか

アナライザーは、Visual Studio、Visual Studio Code (C# Dev Kit 拡張機能を使用)、およびコマンド ラインの dotnet build 中に自動的に実行されます。 オーケストレーター コードが検査され、IDE のエラー一覧とビルド出力に警告またはエラーとして診断が報告されます。

開いているファイルを分析するために IDE 構成は必要ありません。 NuGet パッケージがプロジェクトに存在するとすぐにアナライザーがアクティブになります。

Tip

既定では、Visual Studioは開いているファイルに対してのみアナライザーを実行します。 ソリューション全体を一度に分析するには、 Tools>Options>Text Editor>C#>Advanced に 移動し、 バックグラウンド分析スコープ を [ソリューション全体] に設定します。

複数のルールについて、アナライザーは Visual Studio と VS Code で自動コード修正 (クイック アクション) も提供します。 たとえば、 DateTime.Now を 1 回のクリックで context.CurrentUtcDateTime に置き換えることができます。

アナライザー ルール

次のセクションでは、Durable Task Roslyn Analyzer に付属するアナライザー ルールをカテゴリ別にグループ化して一覧表示します。

オーケストレーション規則

これらの規則では、オーケストレーション メソッド内で非決定論的または安全でない API の使用を検出することで、 オーケストレーター コードの制約 が適用されます。

ルール識別子 Severity Description コード修正
DURABLE0001 Warning オーケストレーション内の非決定的な DateTime プロパティ (DateTime.Now、 DateTime.UtcNow、 DateTime.Today、 DateTimeOffset.Now、 DateTimeOffset.UtcNow) を検出します。 context.CurrentUtcDateTime を代わりに使用します。 はい
DURABLE0002 Warning オーケストレーション内の Guid.NewGuid() を検出します。 context.NewGuid() を代わりに使用します。 はい
DURABLE0003 Warning オーケストレーション内の Task.Delay または Thread.Sleep を検出します。 context.CreateTimer を代わりに使用します。 はい
DURABLE0004 Warning オーケストレーション内の非決定論的スレッド API とタスク API (Thread.Start、 Task.Run、 Task.ContinueWith、 TaskFactory.StartNew) を検出します。 いいえ
DURABLE0005 Warning オーケストレーションで直接使用される I/O API (HttpClient、Azure Storage クライアントなど) を検出します。 I/O 呼び出しをアクティビティに移動します。 いいえ
DURABLE0006 Warning オーケストレーション System.Environment API の使用状況 ( GetEnvironmentVariableなど) を検出します。 いいえ
DURABLE0007 Warning オーケストレーション関数シグネチャ CancellationToken パラメーターを検出します。 いいえ
DURABLE0008 Warning オーケストレーション関数パラメーター内の[OrchestrationTrigger] 以外のバインド ( [EntityTrigger]、 [DurableClient]など) を検出します。 いいえ
DURABLE0009 情報 context.GetInput<T>()の代わりに入力パラメーターを使用するよう提案します。 いいえ
DURABLE0010 Warning オーケストレーションでのコンテキストに依存しない ILogger の使用状況を検出します。 context.CreateReplaySafeLogger() を代わりに使用します。 いいえ
DURABLE0011 Warning while (true)を呼び出さないバインドされていないContinueAsNewオーケストレーション ループを検出します。 ContinueAsNewがないと、オーケストレーション履歴は無期限に拡張されます。 いいえ
ルール識別子 Severity Description コード修正
DURABLE0001 Warning オーケストレーション内の非決定的な DateTime プロパティ (DateTime.Now、 DateTime.UtcNow、 DateTime.Today、 DateTimeOffset.Now、 DateTimeOffset.UtcNow) を検出します。 context.CurrentUtcDateTime を代わりに使用します。 はい
DURABLE0002 Warning オーケストレーション内の Guid.NewGuid() を検出します。 context.NewGuid() を代わりに使用します。 はい
DURABLE0003 Warning オーケストレーション内の Task.Delay または Thread.Sleep を検出します。 context.CreateTimer を代わりに使用します。 はい
DURABLE0004 Warning オーケストレーション内の非決定論的スレッド API とタスク API (Thread.Start、 Task.Run、 Task.ContinueWith、 TaskFactory.StartNew) を検出します。 いいえ
DURABLE0005 Warning オーケストレーションで直接使用される I/O API (HttpClient、Azure Storage クライアントなど) を検出します。 I/O 呼び出しをアクティビティに移動します。 いいえ
DURABLE0006 Warning オーケストレーション System.Environment API の使用状況 ( GetEnvironmentVariableなど) を検出します。 いいえ
DURABLE0009 情報 context.GetInput<T>()の代わりに入力パラメーターを使用するよう提案します。 いいえ
DURABLE0010 Warning オーケストレーションでのコンテキストに依存しない ILogger の使用状況を検出します。 context.CreateReplaySafeLogger() を代わりに使用します。 いいえ
DURABLE0011 Warning while (true)を呼び出さないバインドされていないContinueAsNewオーケストレーション ループを検出します。 ContinueAsNewがないと、オーケストレーション履歴は無期限に拡張されます。 いいえ

Note

ルールDURABLE0007、DURABLE0008、および DURABLE1001-DURABLE1003 はAzure Functionsにのみ適用され、スタンドアロンの Durable Task SDK アナライザーには含まれません。

バインディング 規則

これらの規則は、トリガーとクライアントのバインドが正しいパラメーター型に適用されることを検証します。

ルール識別子 Severity Description コード修正
DURABLE1001 エラー [OrchestrationTrigger]がTaskOrchestrationContextパラメーターにのみ適用されるようにします。 はい
DURABLE1002 エラー [DurableClient]がDurableTaskClientパラメーターにのみ適用されるようにします。 はい
DURABLE1003 エラー [EntityTrigger]がTaskEntityDispatcherパラメーターにのみ適用されるようにします。 はい

アクティビティ ルール

これらの規則では、アクティビティ呼び出しとサブオーケストレーション呼び出しで型の不一致と未解決の名前がチェックされます。

ルール識別子 Severity Description コード修正
DURABLE2001 Warning アクティビティの呼び出しとアクティビティ定義の入力の種類の不一致を検出します。 いいえ
DURABLE2002 Warning アクティビティ呼び出しとアクティビティ定義の間の出力の種類の不一致を検出します。 いいえ
DURABLE2003 情報 アクティビティ呼び出しがコンパイルで定義されているアクティビティと一致しない名前を参照すると報告されます。 いいえ
DURABLE2004 情報 サブオーケストレーション呼び出しがコンパイルで定義されたオーケストレーターと一致しない名前を参照すると報告されます。 いいえ

詳細については、GitHubのanalyzer のリリース ノートを参照してください。

Roslyn Analyzer の警告を抑制する

プロジェクト、ファイル、または行レベルでアナライザー診断を抑制できます。

.editorconfig を使用して抑制する

.editorconfig ファイルにエントリを追加して、ルールの重大度を変更するか、完全に無効にします。

[*.cs]
dotnet_diagnostic.DURABLE0001.severity = none

有効な重大度の値は、 error、 warning、 suggestion、 silent、および noneです。

#pragma でインライン抑制

#pragma warning disableを使用して、コードのセクションで特定の警告を抑制します。

#pragma warning disable DURABLE0001
var now = DateTime.UtcNow;
#pragma warning restore DURABLE0001

プロジェクト レベルで抑制する

<NoWarn>エントリを.csproj ファイルに追加して、プロジェクト全体のルールを抑制します。

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

レガシ .NETインプロセス アナライザー

.NETインプロセス プログラミング モデルには、古い Roslyn アナライザーが別に存在します。 このアナライザーは、Microsoft.Azure.WebJobs.Extensions.DurableTask パッケージの一部であり、DF ではなく、別の規則プレフィックス (DURABLE) を使用します。 2 つのアナライザーは完全に個別のパッケージであり、ルール ID は共有しません。

従来のインプロセス アナライザーは、新しいルールや機能強化を受け取りません。

インプロセス アナライザールール (DF0101– DF0307) の詳細については、Analyzer v0.2.0 リリース ページを参照してください。

次のステップ