رفع دوگانگی محیط اجرای MSBuild در NET 10 RC 2.
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۷/۲۵ ۱۲:۴۴
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
dotnet build و dotnet pack)، بلکه بهعنوان یک ارائهدهنده اطلاعات در مورد پروژهها نیز عمل میکند (مثلاً در dotnet list package).dotnet CLI: زمانی که شما دستوری مانند dotnet build را اجرا میکنید، از نسخهی MSBuild استفاده میشود که همراه با .NET SDK مدرن (مثلاً .NET 8, 9, 10) ارائه شده و بر روی پلتفرم .NET اجرا میشود.msbuild.exe را فراخوانی میکنید، از نسخهای از MSBuild استفاده میشود که همراه با ویژوال استودیو نصب شده و یک اپلیکیشن .NET Framework است.net8.0) هدفگذاری میکردید تا از آخرین APIهای داتنت بهرهمند شوید، آن تسک در dotnet CLI به خوبی کار میکرد، اما در Visual Studio یا هنگام فراخوانی مستقیم msbuild.exe با شکست مواجه میشد.dotnet CLI) و هم برای .NET Framework (اغلب netstandard2.0 یا net472 جهت Visual Studio) کامپایل کنند. این فرآیند نهتنها پیچیده بود، بلکه توسعهدهندگان را از استفاده از ویژگیهای مدرن داتنت در تسکهایشان محروم میکرد.msbuild.exe و ویژوال استودیو قادر خواهند بود تسکهای MSBuild را که برای .NET مدرن ساخته شدهاند، اجرا کنند!dotnet CLI و چه در داخل Visual Studio—به درستی کار خواهند کرد. این امر مشکلات مربوط به چند-هدفگذاری و مدیریت وابستگیهای .NET Framework را که بهطور ضمنی در MSBuild قدیمی وجود داشت، از بین میبرد.UsingTask خود را در فایل .targets تغییر دهید تا MSBuild از نحوه اجرای تسک شما مطلع شود.Runtime و TaskFactory را اضافه کنید:<UsingTask TaskName="MyTask" AssemblyFile="path\to\MyTask.dll" Runtime="NET" # این ویژگی جدید است! TaskFactory="TaskHostFactory" # و این هم جدید است! />
Runtime="NET": به MSBuild میگوید که این تسک برای .NET مدرن ساخته شده است (در مقابل .NET Framework).TaskFactory="TaskHostFactory": به MSBuild دستور میدهد که از TaskHostFactory برای اجرای تسک استفاده کند. TaskHostFactory یک قابلیت موجود در MSBuild است که اجازه میدهد تسکها خارج از فرآیند اصلی (out-of-process) اجرا شوند.TaskHostFactoryهمیشه تسک را بهصورت out-of-process اجرا میکند، حتی زمانی که در dotnet CLI هستید (جایی که نیازی به این کار نیست).dotnet CLI بهصورت بهینه (in-process) اجرا گردد:<UsingTask TaskName="MyTask"
AssemblyFile="path\to\MyTask.dll"
Runtime="NET"
TaskFactory="TaskHostFactory"
Condition="$(MSBuildRuntimeType) == 'Full'"
/>
<UsingTask TaskName="MyTask"
AssemblyFile="path\to\MyTask.dll"
Runtime="NET"
Condition="$(MSBuildRuntimeType) == 'Core'"
/>Condition در MSBuild استفاده کردهایم:$(MSBuildRuntimeType) == 'Full': این شرط زمانی درست است که MSBuild در محیط .NET Framework (مانند ویژوال استودیو یا msbuild.exe) اجرا میشود. در این حالت، ما از TaskHostFactory برای اجرای OOP استفاده میکنیم.$(MSBuildRuntimeType) == 'Core': این شرط زمانی درست است که MSBuild در محیط .NET مدرن (مانند dotnet CLI) اجرا میشود. در این حالت، ما TaskFactory را مشخص نمیکنیم و تسک بهطور عادی و in-process (درون فرآیند اصلی) بارگذاری میشود که بهترین کارایی را دارد.Runtime یا TaskFactory.