عنوان:

‫مسدود کردن استفاده از متدهای ناامن در پروژه‌های دات‌نت با Roslyn


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۰۷ ۰۸:۳۱
آدرس: www.dntips.ir
این مقاله نحوه‌ی استفاده از 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 می‌تواند در این مورد کمک کند. بهتر است یک کامنت نیز برای توضیح اینکه چرا استفاده‌ی خاصی مجاز است، اضافه کنید.


مشاهده مطلب اصلی