지속 가능 작업 Roslyn 분석기는 C# Durable Functions 앱에서 오케스트레이터 코드 제약 조건을 따르는 데 도움이 되는 실시간 코드 분석기입니다. 코드가 프로덕션에 도달하기 전에 비결정적 API 사용, 잘못된 바인딩 및 형식 불일치와 같은 일반적인 문제를 빌드 시 검색합니다.
분석기는 Microsoft.Azure.Functions.Worker.Extensions.DurableTask NuGet 패키지(v1.6.0 이상)와 함께 번들로 제공되며 기본적으로 사용하도록 설정됩니다. 추가 설정이 필요하지 않습니다.
지속성 작업 Roslyn 분석기는 C# Durable Task SDK 앱에서 오케스트레이터 코드 제약 조건을 따르는 데 도움이 되는 라이브 코드 분석기입니다. 코드가 프로덕션에 도달하기 전에 빌드 시 비결정적 API 사용 및 형식 불일치와 같은 일반적인 문제를 검색합니다.
분석기를 사용하려면 프로젝트에 NuGet 패키지를 추가 Microsoft.DurableTask.Analyzers 합니다.
dotnet add package Microsoft.DurableTask.Analyzers
작동 방식
분석기는 명령줄에서 Visual Studio, Visual Studio Code(C# Dev Kit 확장 사용) 및 dotnet build 동안 자동으로 실행됩니다. 오케스트레이터 코드를 검사하고 진단을 IDE의 오류 목록 및 빌드 출력에서 경고 또는 오류로 보고합니다.
열려 있는 파일을 분석하는 데 IDE 구성이 필요하지 않습니다. 프로젝트에 NuGet 패키지가 있는 즉시 분석기가 활성화됩니다.
팁 (조언)
기본적으로 Visual Studio 열려 있는 파일에서만 분석기를 실행합니다. 전체 솔루션을 한 번에 분석하려면 도구>옵션>텍스트 편집기>C#>Advanced 로 이동하여 백그라운드 분석 범위를전체 솔루션으로 설정합니다.
여러 규칙의 경우 분석기는 Visual Studio 및 VS Code에서 자체 코드 수정(빠른 작업)을 제공합니다. 예를 들어 한 번의 클릭으로 context.CurrentUtcDateTime 바꿀 DateTime.Now 수 있습니다.
분석기 규칙
다음 섹션에서는 지속성 작업 Roslyn 분석기와 함께 범주별로 그룹화된 분석기 규칙을 나열합니다.
오케스트레이션 규칙
이러한 규칙은 오케스트레이션 메서드 내에서 비결정적이거나 안전하지 않은 API 사용을 검색하여 오케스트레이터 코드 제약 조건을 적용합니다.
| 규칙 ID | 심각도 | 설명 | 코드 수정 |
|---|---|---|---|
| DURABLE0001 | 경고 | 오케스트레이션에서 비결정적 DateTime 속성(DateTime.Now, DateTime.UtcNow, DateTime.Today, DateTimeOffset.Now, DateTimeOffset.UtcNow)을 검색합니다.
context.CurrentUtcDateTime를 대신 사용하세요. |
Yes |
| DURABLE0002 | 경고 | 오케스트레이션에서 Guid.NewGuid()을(를) 감지합니다.
context.NewGuid()를 대신 사용하세요. |
Yes |
| DURABLE0003 | 경고 | 오케스트레이션에서 Task.Delay 또는 Thread.Sleep을 감지합니다.
context.CreateTimer를 대신 사용하세요. |
Yes |
| DURABLE0004 | 경고 | 오케스트레이션에서 비결정적 스레드 및 작업 API(Thread.Start, Task.Run, Task.ContinueWith, TaskFactory.StartNew)를 검색합니다. |
No |
| DURABLE0005 | 경고 | 오케스트레이션에 직접 사용되는 I/O API(예: HttpClient, Azure Storage 클라이언트)를 검색합니다. I/O 호출을 작업으로 이동합니다. |
No |
| DURABLE0006 | 경고 | 오케스트레이션에서 System.Environment API 사용(예: GetEnvironmentVariable)을 감지합니다. |
No |
| DURABLE0007 | 경고 |
CancellationToken 오케스트레이션 함수 서명에서 매개 변수를 검색합니다. |
No |
| DURABLE0008 | 경고 | 오케스트레이션 함수 매개 변수에서 바인딩이 아닌[OrchestrationTrigger] (예: [EntityTrigger], [DurableClient])를 검색합니다. |
No |
| DURABLE0009 | Info | 대신 입력 매개 변수 사용을 제안합니다 context.GetInput<T>(). |
No |
| DURABLE0010 | 경고 | 오케스트레이션에서 비 컨텍스트 ILogger 사용량을 검색합니다.
context.CreateReplaySafeLogger()를 대신 사용하세요. |
No |
| DURABLE0011 | 경고 | 호출ContinueAsNew하지 않는 바인딩되지 while (true) 않은 오케스트레이션 루프를 검색합니다. 오케스트레이션 기록이 없으면 ContinueAsNew오케스트레이션 기록이 무기한 증가합니다. |
No |
| 규칙 ID | 심각도 | 설명 | 코드 수정 |
|---|---|---|---|
| DURABLE0001 | 경고 | 오케스트레이션에서 비결정적 DateTime 속성(DateTime.Now, DateTime.UtcNow, DateTime.Today, DateTimeOffset.Now, DateTimeOffset.UtcNow)을 검색합니다.
context.CurrentUtcDateTime를 대신 사용하세요. |
Yes |
| DURABLE0002 | 경고 | 오케스트레이션에서 Guid.NewGuid()을(를) 감지합니다.
context.NewGuid()를 대신 사용하세요. |
Yes |
| DURABLE0003 | 경고 | 오케스트레이션에서 Task.Delay 또는 Thread.Sleep을 감지합니다.
context.CreateTimer를 대신 사용하세요. |
Yes |
| DURABLE0004 | 경고 | 오케스트레이션에서 비결정적 스레드 및 작업 API(Thread.Start, Task.Run, Task.ContinueWith, TaskFactory.StartNew)를 검색합니다. |
No |
| DURABLE0005 | 경고 | 오케스트레이션에 직접 사용되는 I/O API(예: HttpClient, Azure Storage 클라이언트)를 검색합니다. I/O 호출을 작업으로 이동합니다. |
No |
| DURABLE0006 | 경고 | 오케스트레이션에서 System.Environment API 사용(예: GetEnvironmentVariable)을 감지합니다. |
No |
| DURABLE0009 | Info | 대신 입력 매개 변수 사용을 제안합니다 context.GetInput<T>(). |
No |
| DURABLE0010 | 경고 | 오케스트레이션에서 비 컨텍스트 ILogger 사용량을 검색합니다.
context.CreateReplaySafeLogger()를 대신 사용하세요. |
No |
| DURABLE0011 | 경고 | 호출ContinueAsNew하지 않는 바인딩되지 while (true) 않은 오케스트레이션 루프를 검색합니다. 오케스트레이션 기록이 없으면 ContinueAsNew오케스트레이션 기록이 무기한 증가합니다. |
No |
메모
규칙 DURABLE0007, DURABLE0008 및 DURABLE1001-DURABLE1003는 Azure Functions에만 적용되며, 독립 실행형 Durable Task SDK 분석기에는 포함되지 않습니다.
바인딩 규칙
이러한 규칙은 트리거 및 클라이언트 바인딩이 올바른 매개 변수 형식에 적용되는지 확인합니다.
| 규칙 ID | 심각도 | 설명 | 코드 수정 |
|---|---|---|---|
| DURABLE1001 | 오류 |
[OrchestrationTrigger] 매개 변수에만 TaskOrchestrationContext가 적용되도록 합니다. |
Yes |
| DURABLE1002 | 오류 |
[DurableClient] 매개 변수에만 DurableTaskClient가 적용되도록 합니다. |
Yes |
| DURABLE1003 | 오류 |
[EntityTrigger] 매개 변수에만 TaskEntityDispatcher가 적용되도록 합니다. |
Yes |
활동 규칙
이러한 규칙은 활동 및 하위 오케스트레이션 호출에서 형식 불일치 및 해결되지 않은 이름을 확인합니다.
| 규칙 ID | 심각도 | 설명 | 코드 수정 |
|---|---|---|---|
| DURABLE2001 | 경고 | 활동 호출과 활동 정의 간의 입력 형식 불일치를 검색합니다. | No |
| DURABLE2002 | 경고 | 활동 호출과 활동 정의 간의 출력 형식 불일치를 검색합니다. | No |
| DURABLE2003 | Info | 작업 호출이 컴파일에서 정의된 활동과 일치하지 않는 이름을 참조하는 경우 보고합니다. | No |
| DURABLE2004 | Info | 하위 오케스트레이션 호출이 컴파일에서 정의된 오케스트레이터와 일치하지 않는 이름을 참조하는 경우 보고합니다. | No |
자세한 내용은 GitHub analyzer 릴리스 정보 참조하세요.
Roslyn 분석기 경고 표시 안 함
프로젝트, 파일 또는 선 수준에서 분석기 진단을 표시하지 않을 수 있습니다.
".editorconfig으로 억제"
파일 .editorconfig에 항목을 추가하여 규칙의 심각도를 변경하거나 완전히 비활성화합니다.
[*.cs]
dotnet_diagnostic.DURABLE0001.severity = none
유효한 심각도 값은 error, warning, suggestionsilent및 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 in-process 프로그래밍 모델에 대한 별도의 이전 Roslyn 분석기가 있습니다. 이 분석기는 Microsoft.Azure.WebJobs.Extensions.DurableTask 패키지의 일부이며 다른 규칙 접두사(DURABLE 대신 DURABLE)를 사용합니다. 두 분석기는 완전히 별도의 패키지이며 규칙 ID를 공유하지 않습니다.
중요합니다
.NET in-process 프로그래밍 모델이 사용 중지되고 있습니다. 새 프로젝트에는 .NET 격리된 작업자 모델 사용합니다. 레거시 In-Process 분석기는 새로운 규칙이나 개선 사항을 받지 못합니다.
in-process 분석기 규칙(DF0101–DF0307)에 대한 자세한 내용은 Analyzer v0.2.0 릴리스 페이지 참조하세요.