این مقاله نحوهی استفاده از BannedApiAnalyzers در Roslyn را برای مسدود کردن فراخوانی متدهای خاص در پروژههای داتنت، بهبود کیفیت کد و جلوگیری از استفاده از توابع ناامن یا منسوخشده شرح میدهد.
مشکل
- فراخوانی توابع همگام میتواند ناخواسته معرفی شود؛ حتی زمانیکه نسخههای ناهمگام ترجیح داده میشوند (به عنوان مثال، ToList در مقابل ToListAsync).
- یافتن و جایگزینی دستی همهی موارد یک فراخوانی تابع، خستهکننده و مستعد خطا است.
راه حل: استفاده از BannedApiAnalyzers
- BannedApiAnalyzers اجازه میدهد قوانینی را برای مسدود کردن قطعه کدهای خاصی تعریف کنید و هشدارها یا خطاهای کامپایلری را ایجاد کنید.
- مشابه ESLint برای NodeJS، به اجرای استانداردهای کدنویسی کمک میکند.
مراحل پیادهسازی
- بسته NuGet: بسته NuGet Microsoft.CodeAnalysis.BannedApiAnalyzers را به پروژه خود اضافه کنید.
- BannedSymbols.txt: فایلی به نام BannedSymbols.txt را در پروژه خود ایجاد کنید.
- پیکربندی csproj: موارد زیر را به فایل .csproj خود اضافه کنید:
<ItemGroup>
<AdditionalFiles Include="BannedSymbols.txt" />
</ItemGroup>
تعریف نمادهای ممنوعه: سپس ورودیها را به فایل BannedSymbols.txt با فرمت
P:System.DateTime.Now; Please use DateTime.UtcNow instead
اضافه کنید. در اینجا پیشوند، نوع را نشان میدهد (به عنوان مثال، P برای ویژگی، T برای نوع) و پیام بعد از نقطه ویرگول، پیام هشدار/خطا است.
ساخت ورودیهای BannedSymbols.txt
- رشتههای شناسهی مستندات در BannedSymbols.txt استفاده میشوند.
- انواع جنریک به علامتگذاری خاصی نیاز دارند. برای مثال ذکر C:System.Collections.Generic.List<string> نادرست است و T:System.Collections.Generic.List1` صحیح است.
- استفاده از ویژگی "Copy/Paste Special" -> "XML-Doc ID" در JetBrains Rider، تولید این رشتهها را ساده میکند.
اعمال قوانین به کل کدبیس
یک فایل Directory.Build.props و یک فایل BannedSymbols.txt را در یک دایرکتوری درون راهحل خود ایجاد کنید.
موارد زیر را به Directory.Build.props اضافه کنید:
<Project>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/BannedSymbols.txt" />
</ItemGroup>
</Project>- استفاده از (MSBuildThisFileDirectory)$ برای جلوگیری از خطاهای بیلد در پروژههای دیگر بسیار مهم است.
- این رویکرد قوانین را به همهی پروژهها در داخل دایرکتوری و زیرشاخههای آن اعمال میکند.
اجازه دادن به موارد خاص
از دستورات pragma# برای غیرفعال کردن هشدارها برای مواردی خاص از یک فراخوانی مسدود شده استفاده کنید. منوی "Context Actions" -> "Inspection" -> "Disable with #pragma" در Rider میتواند در این مورد کمک کند. بهتر است یک کامنت نیز برای توضیح اینکه چرا استفادهی خاصی مجاز است، اضافه کنید.
مشاهده مطلب اصلی