عنوان:

‫پایان پشتیبانی بسته‌های Template Engine از netstandard2.0 در دات‌نت ۱۱؛ علل، اثرات و راهنمای مهاجرت


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۶ ۰۸:۲۰
آدرس: www.dntips.ir
چکیده: موتور قالب‌سازی دات‌نت (.NET Template Engine) هسته اصلی ساخت قالب‌های پروژه‌ها و آیتم‌ها در ابزارهای خط فرمان (dotnet new) و محیط‌های توسعه نظیر Visual Studio است. با آغاز انتشار نسخه‌های پیش‌نمایش .NET 11، مایکروسافت پشتیبانی از هدف‌گذاری .NET Standard 2.0 (netstandard2.0) را از بسته‌های رسمی NuGet این موتور حذف کرده است. این تغییر که یک تغییر شکننده (Breaking Change) در سازگاری سورس و باینری محسوب می‌شود، ناشی از منسوخ‌شدن هدف‌گذاری مذکور در وابستگی‌های کلیدی NuGet Client SDK است. این مقاله به بررسی علل فنی این تصمیم، بسته‌ها و پروژه‌های تحت‌تأثیر، پیامدهای معماری و ارائه راهکارهای عملی و گام‌به‌گام برای به‌روزرسانی و مهاجرت پروژه‌ها می‌پردازد.

۱. مقدمه
برای سال‌های متمادی، استاندارد .NET Standard 2.0 به‌عنوان پلی استاندارد و همه‌منظوره جهت به‌اشتراک‌گذاری کتابخانه‌ها و کدها میان اکوسیستم سنتی (.NET Framework 4.6.1+) و دات‌نت مدرن (.NET Core / Modern .NET) مورد استفاده قرار می‌گرفت. بسته‌های زیرساختی موتور تمپلیت دات‌نت نیز برای تضمین حداکثر سازگاری ممکن با پلتفرم‌ها و ابزارهای گوناگون، سال‌ها از هدف netstandard2.0 پشتیبانی می‌کردند. با این حال، پیشرفت سریع زیست‌بوم دات‌نت و به‌روزرسانی مداوم کتابخانه‌های پایه باعث ایجاد چالش‌هایی در زنجیره وابستگی‌ها (Dependency Tree) شد. از نسخه .NET 11 (معرفی‌شده از پیش‌نمایش ۴)، این بسته‌ها تنها فریم‌ورک‌های هدف مدرن و نسخه‌های پایدار پشتیبانی‌شده را هدف قرار می‌دهند. آگاهی از این تحول برای تیم‌هایی که پلاگین‌های IDE، ابزارهای CLI سفارشی یا کتابخانه‌های مدیریت الگو توسعه می‌دهند، امری ضروری است.

۲. بررسی دقیق تغییرات و علت تصمیم‌گیری
۲.۱. رفتار پیشین در برابر رفتار جدید
- رفتار پیشین: بسته‌های موتور تمپلیت شامل تارگت netstandard2.0 بودند و در نتیجه، پروژه‌های مبتنی بر .NET Core 2.x/3.x، نسخه‌های قدیمی‌تر .NET Framework و همچنین کتابخانه‌های کلاسی .NET Standard 2.0 امکان ارجاع مستقیم به آن‌ها را داشتند.
- رفتار جدید: بسته‌های منتشرشده فقط اهداف زیر را پشتیبانی می‌کنند:
  • net9.0
  • net11.0
  • net472 (.NET Framework 4.7.2)

۲.۲. بسته‌های تحت تأثیر
تغییر یادشده بسته‌های رسمی زیر را در بر می‌گیرد:
  • Microsoft.TemplateEngine.Abstractions
  • Microsoft.TemplateEngine.Core
  • Microsoft.TemplateEngine.Core.Contracts
  • Microsoft.TemplateEngine.Edge
  • Microsoft.TemplateEngine.Orchestrator.RunnableProjects
  • Microsoft.TemplateEngine.Utils
  • Microsoft.TemplateEngine.IDE
  • Microsoft.TemplateLocalizer.Core

نکته کلیدی: رابط‌های برنامه‌نویسی عمومی (Public APIs) هیچ تغییری نکرده‌اند؛ یعنی نام کلاس‌ها، متدها و امضاهای آن‌ها دست‌نخورده باقی مانده و صرفاً لایه تارگت فریم‌ورک‌ها تغییر کرده است.

۲.۳. ریشه فنی تغییر
بسته Microsoft.TemplateEngine.Edge برای دریافت، نصب و اعتبارسنجی قالب‌ها به پکیج‌های NuGet Client نظیر NuGet.Protocol، NuGet.Configuration و NuGet.Credentials وابسته است. از نسخه ۷.۰ به بعد، پکیج‌های کلاینت NuGet پشتیبانی از netstandard2.0 را به‌طور کامل کنار گذاشتند.
تیم توسعه دات‌نت برای حفظ پشتیبانی از netstandard2.0 مجبور بود:
  • نسخه‌های قدیمی‌تر پکیج‌های NuGet را به‌صورت قفل‌شده (Pinned) نگه دارد.
  • قابلیت‌هایی مانند CentralPackageTransitivePinningEnabled را غیرفعال کند تا از تعارض وابستگی‌های متعدی (Transitive Dependencies) جلوگیری شود.
این بن‌بست فنی مانع از بهره‌مندی ابزارهای ساخت از آخرین بهبودهای امنیتی، کارایی و پروتکل‌های نوین NuGet می‌شد. بنابراین، حذف netstandard2.0 گامی اجتناب‌ناپذیر برای نوسازی این اکوسیستم بود.

۳. تحلیل اثرات و سازگاری
این تغییر یک Breaking Change از نوع سازگاری سورس (Source Compatibility) و سازگاری باینری (Binary Compatibility) است:
  • اگر پروژه‌ای با هدف netstandard2.0 کامپایل شود، در زمان بازیابی بسته‌ها (Restore) یا بیلد با خطای عدم تطابق فریم‌ورک (NU1202 / TargetFramework mismatch) مواجه خواهد شد.
  • کتابخانه‌های کامپایل‌شده پیشین که متکی به این تارگت هستند، امکان اجرای مستقیم روی ران‌تایم‌های ناسازگار بدون ارتقا را نخواهند داشت.

۴. راهکارها و راهنمای مهاجرت
توسعه‌دهندگان بسته به نوع و معماری پروژه خود می‌توانند یکی از راهکارهای زیر را در پیش بگیرند:
سناریوی ۱: ارتقای پروژه‌های کلاینت یا ابزارهای CLI مدرن
اگر ابزار یا سرویس شما روی دات‌نت مدرن اجرا می‌شود، کافی است فایل پروژه (.csproj) را برای هدف‌گذاری net9.0 یا net11.0 به‌روزرسانی کنید:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <!-- تغییر از netstandard2.0 به نسخه مدرن دات‌نت -->
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.TemplateEngine.Edge" Version="11.0.0-preview.*" />
  </ItemGroup>
</Project>

سناریوی ۲: پروژه‌های مبتنی بر .NET Framework (مانند افزونه‌های قدیمی‌تر Visual Studio)
اگر در حال توسعه پلاگین‌هایی هستید که داخل پردازش‌های مبتنی بر اکوسیستم سنتی ویندوز/ویژوال استودیو اجرا می‌شوند، پروژه خود را به net472 ارتقا دهید:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.TemplateEngine.Edge" Version="11.0.0-preview.*" />
  </ItemGroup>
</Project>

سناریوی ۳: کتابخانه‌هایی که نیاز به پشتیبانی همزمان از چند فریم‌ورک دارند (Multi-Targeting)
اگر کتابخانه‌ای توسعه می‌دهید که باید همزمان در محیط‌های مختلف استفاده شود، بهترین راهبرد استفاده از Multi-Targeting با تگ است:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <!-- پشتیبانی همزمان از .NET مدرن و .NET Framework -->
    <TargetFrameworks>net9.0;net11.0;net472</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.TemplateEngine.Abstractions" Version="11.0.0-preview.*" />
  </ItemGroup>
</Project>

۵. نتیجه‌گیری
حذف پشتیبانی از .NET Standard 2.0 در بسته‌های Template Engine دات‌نت ۱۱، بخشی از سیاست کلی مایکروسافت جهت ساده‌سازی زنجیره وابستگی‌ها و همگام‌سازی ابزارهای زیرساختی با استانداردهای مدرن اکوسیستم دات‌نت است. از آن‌جا که کدهای عمومی و APIها بدون تغییر مانده‌اند، مهاجرت به این ساختار جدید کم‌هزینه بوده و عمدتاً محدود به ویرایش پیکربندی فریم‌ورک هدف (TargetFramework) در فایل‌های پروژه خواهد بود. تیم‌های توسعه توصیه می‌شوند هرچه سریع‌تر پروژه‌های مرتبط را با تارگت‌های net9.0، net11.0 یا net472 سازگار سازند.