پایان پشتیبانی بستههای 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.0net11.0net472 (.NET Framework 4.7.2)Microsoft.TemplateEngine.AbstractionsMicrosoft.TemplateEngine.CoreMicrosoft.TemplateEngine.Core.ContractsMicrosoft.TemplateEngine.EdgeMicrosoft.TemplateEngine.Orchestrator.RunnableProjectsMicrosoft.TemplateEngine.UtilsMicrosoft.TemplateEngine.IDEMicrosoft.TemplateLocalizer.Coreنکته کلیدی: رابطهای برنامهنویسی عمومی (Public APIs) هیچ تغییری نکردهاند؛ یعنی نام کلاسها، متدها و امضاهای آنها دستنخورده باقی مانده و صرفاً لایه تارگت فریمورکها تغییر کرده است.
Microsoft.TemplateEngine.Edge برای دریافت، نصب و اعتبارسنجی قالبها به پکیجهای NuGet Client نظیر NuGet.Protocol، NuGet.Configuration و NuGet.Credentials وابسته است. از نسخه ۷.۰ به بعد، پکیجهای کلاینت NuGet پشتیبانی از netstandard2.0 را بهطور کامل کنار گذاشتند.netstandard2.0 مجبور بود:CentralPackageTransitivePinningEnabled را غیرفعال کند تا از تعارض وابستگیهای متعدی (Transitive Dependencies) جلوگیری شود.netstandard2.0 گامی اجتنابناپذیر برای نوسازی این اکوسیستم بود.netstandard2.0 کامپایل شود، در زمان بازیابی بستهها (Restore) یا بیلد با خطای عدم تطابق فریمورک (NU1202 / TargetFramework mismatch) مواجه خواهد شد..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>net472 ارتقا دهید:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.TemplateEngine.Edge" Version="11.0.0-preview.*" />
</ItemGroup>
</Project><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 سازگار سازند.