نسخهٔ 7.0 کتابخانهٔ Rx.NET (System.Reactive) منتشر شد. مهم‌ترین تغییر، جدا کردن ادغام‌های رابط کاربری ویندوز از بستهٔ اصلی است که باعث کوچک‌تر شدن خروجی‌های استقرار self-contained و Native AOT می‌شود.

چه چیزی تغییر کرده؟

System.Reactive اکنون قابلیت‌های مرتبط با WPF، Windows Forms، UWP و Windows Runtime را از بستهٔ اصلی جدا کرده و آن‌ها را در بسته‌های NuGet مستقل قرار داده است: System.Reactive.Windows.Forms، System.Reactive.Wpf، System.Reactive.WindowsRuntime و System.Reactive.Uwp. پروژه‌هایی که از این ادغام‌ها استفاده می‌کنند باید پس از ارتقا، بستهٔ متناظر را صریحاً اضافه کنند؛ برای سایر پروژه‌ها نیازی به تغییر در کد منبع وجود ندارد.

تأثیر بر اندازهٔ انتشار

  • ارجاع به System.Reactive در پروژه‌هایی با TFM مخصوص ویندوز (مثلاً net8.0-windows10.0.19041) می‌توانست کل فریم‌ورک‌های WPF و Windows Forms را وارد خروجی استقرار کند.
  • براساس بررسی نگهدارندگان، این موضوع می‌توانست حدود 90 مگابایت به خروجی اضافه کند (بدون Trim)، حدود 47 مگابایت با Trim و نزدیک به 11 مگابایت در ساخت‌های Native AOT.
  • با تفکیک بسته‌ها، پروژه‌های self-contained و Native AOT که از UIهای ویندوز استفاده نمی‌کنند، اکنون می‌توانند حجم استقرار را به‌طور قابل‌توجهی کاهش دهند.

سازگاری باینری و ابزار کمکی

تیم نگهداری سازگاری باینری را حفظ کرده است: APIهای قدیمی رابط‌های کاربری در اسمبلی‌های زمان اجرا داخل بستهٔ NuGet همچنان موجودند، اما از اسمبلی‌های مرجع حذف شده‌اند تا از لینک شدن تصادفی این قابلیت‌ها جلوگیری شود. این رویکرد اجازه می‌دهد اجزای از پیش کامپایل‌شده که علیه نسخهٔ قبلی ساخته شده‌اند همچنان اجرا شوند، در حالی که کد تازه‌کامپایل‌شده باید بستهٔ مناسب را صریحاً اضافه کند.

همراه با System.Reactive 7.0 یک آنالیزور منتشر شده که کدهای تحت تأثیر را شناسایی کرده و بستهٔ مورد نیاز را پیشنهاد می‌دهد. اطلاعات بیشتر و جزئیات انتشار در صفحهٔ NuGet قابل مشاهده است: System.Reactive on NuGet. همچنین مخزن رسمی پروژه در GitHub برای بررسی طراحی و بحث‌های توسعه در دسترس است: Reactive GitHub.

کد و نوشتار مرتبط با Rx.NET و NuGet

تغییرات شکستن و پشتیبانی چارچوب‌ها

نسخهٔ 7.0 پشتیبانی از .NET 6 و .NET 7 را حذف کرده و پشتیبانی از .NET 8، .NET 9، .NET 10، .NET Framework 4.7.2، .NET Standard 2.0 و UWP را ادامه می‌دهد. حاشیه‌نویسی‌های nullable برای تابع OfType اصلاح شده که باعث تغییر امضای متد شد؛ به همین دلیل انتشار به صورت major انجام شد، هرچند رفتار زمان اجرا تغییر نکرده است.

نکات مهاجرت و موارد استثنا

  • پروژه‌هایی که هنوز از packages.config استفاده می‌کنند ممکن است بدون ارجاع صریح، APIهای UI را ببینند؛ چون آن فرمت تمایز بین دارایی‌های ref و lib قائل نمی‌شود. نگهدارندگان این پیکربندی را پشتیبانی رسمی نمی‌کنند و احتمال دارد سازگاری نگهداری‌شده در آینده حذف شود.
  • برای به‌روزرسانی ساده: اگر پروژه‌تان از UI ویندوز استفاده نمی‌کند، معمولاً نیازی به تغییر کد نیست؛ در غیر این صورت بستهٔ متناظر را به فایل پروژه اضافه کنید یا از دستور dotnet add package استفاده نمایید.

بازتاب جامعه و مسیر پیش‌رو

بحث‌های قبلی در جامعهٔ Rx.NET بر مشکلات بسته‌بندی ویندوز و نیاز به سازگاری با مدل‌های استقرار مدرن متمرکز بود؛ توسعه‌دهندگان خواهان بهبود Trim، AOT و مستندسازی روشن‌تر بودند. انتشار 7.0 گام مهمی در جهت اهداف نقشهٔ راهی است که تیم endjin هنگام پذیرش مسئولیت پروژه اعلام کرد.

اهداف بعدی شامل پیاده‌سازی‌هایی با تخصیص کمتر، تولید کد بهتر و احتمالاً افزودن عملگرها و امکانات بیشتر است.

توصیه‌های سریع برای توسعه‌دهندگان

  • اگر خروجی استقرار شما پس از ارتقا افزایش یافته و از TFM ویندوز استفاده می‌کنید، به دنبال ارجاعات ناخواسته به بسته‌های UI بگردید و آنالیزور جدید را اجرا کنید.
  • برای مشاهدهٔ بسته‌ها و نسخه‌ها از صفحهٔ NuGet استفاده کنید و در پروژه‌های legacy که از packages.config بهره می‌برند با احتیاط عمل کنید.
  • در صورت استفاده از ادغام‌های UI، بسته‌های مربوطه را صریحاً به پروژه اضافه کنید تا از وارد شدن غیرضروری وابستگی‌ها به خروجی جلوگیری شود.

انتشار Rx.NET 7.0 نشان می‌دهد نگهداری‌کنندگان اولویت را به بهینه‌سازی استقرار و هماهنگی با روش‌های مدرن توسعهٔ .NET داده‌اند. اکنون زمان آن است که تیم‌ها بسته‌ها را بررسی و در صورت نیاز بسته‌های UI مورد نظر را صریحاً اضافه کنند تا از افزایش غیرضروری حجم خروجی جلوگیری شود.