Rx.NET 7.0: разделение поддержки Windows UI уменьшает размер приложений
Вышла версия Rx.NET 7.0, которая разделяет поддержку Windows UI и основной пакет System.Reactive. Это позволяет избежать включения десятков мегабайт неиспользуемых зависимостей в самодостаточные приложения.

Rx.NET 7.0 — это новое крупное обновление популярной библиотеки реактивного программирования для .NET. Главное изменение — разделение поддержки Windows UI (WPF, Windows Forms, UWP и Windows Runtime) на отдельные пакеты, чтобы сократить размер развертываемых приложений. Раньше все эти интеграции были частью основного пакета System.Reactive, из-за чего даже простые консольные приложения могли тащить за собой десятки мегабайт ненужного кода.
Новая версия выпущена с узконаправленным изменением, которое касается только структуры пакетов и не затрагивает API. Это означает, что большинство разработчиков смогут перейти на Rx.NET 7.0 без изменения кода. Однако те, кто использует Windows-специфичные интеграции, должны будут явно добавить соответствующие пакеты в проект.
Разделение поддержки Windows UI в Rx.NET 7.0
Основная цель Rx.NET 7.0 — уменьшить размер развертывания для Windows-приложений. Ранее пакет System.Reactive включал в себя поддержку WPF, Windows Forms, UWP и Windows Runtime. Это приводило к тому, что даже приложения, не использующие эти технологии, получали лишние зависимости. В новой версии поддержка Windows UI вынесена в отдельные пакеты: System.Reactive.Windows.Threading, System.Reactive.Windows.Forms, System.Reactive.Uwp и System.Reactive.WindowsRuntime.
Такое разделение позволяет разработчикам подключать только те компоненты, которые действительно нужны. Например, если вы создаете приложение на WPF, вам достаточно добавить пакет System.Reactive.Windows.Threading, а не тянуть весь набор. Это особенно важно для самодостаточных (self-contained) приложений, где каждый лишний мегабайт увеличивает время загрузки и занимает место на диске.
По оценкам разработчиков, в некоторых случаях размер развертывания может сократиться на десятки мегабайт. Хотя точные цифры зависят от конкретного проекта, общий принцип понятен: меньше зависимостей — меньше размер.
Предыстория и контекст
Rx.NET — это реализация Reactive Extensions для .NET, которая позволяет работать с асинхронными потоками данных и событиями. Библиотека активно используется в таких продуктах, как Azure, Visual Studio и многих других. За годы существования Rx.NET обросла множеством интеграций с различными платформами, включая Windows-специфичные технологии.
Однако включение всех этих интеграций в один пакет создавало проблему: разработчики, не использующие Windows UI, все равно получали лишние зависимости. Это было особенно заметно при создании кроссплатформенных приложений, где поддержка WPF или UWP была просто не нужна. Вопрос об оптимизации размера пакета поднимался неоднократно, и в Rx.NET 7.0 команда решила эту проблему радикально.
Разделение поддержки Windows UI — это часть более широкой тенденции в .NET-экосистеме к модульности и уменьшению размера приложений. Аналогичные шаги предпринимаются и в других библиотеках, например, в ASP.NET Core, где разработчики могут выбирать только нужные компоненты.
Что это значит для разработчиков?
Для большинства разработчиков переход на Rx.NET 7.0 будет простым: достаточно обновить пакет в проекте. Если вы используете только базовые возможности Rx.NET, то ничего дополнительно делать не нужно. Однако если вы использовали классы вроде DispatcherObservable или WindowObservable, вам придется добавить соответствующие пакеты вручную.
Важно отметить, что разделение пакетов не меняет API, поэтому код, написанный для предыдущих версий, продолжит работать. Единственное изменение — это необходимость явно указывать зависимости для Windows-специфичных функций.
Технические подробности и миграция
Технически новая версия разделяет сборки, которые ранее были частью System.Reactive. Теперь они поставляются как отдельные пакеты, что требует изменения ссылок в проекте. Если вы использовали, например, System.Reactive.Windows.Threading, вам нужно добавить пакет с таким же именем вручную. Для проектов, которые не используют Windows-специфичные функции, ничего менять не нужно.
Команда Rx.NET рекомендует проверить свои проекты на предмет использования пространств имен, связанных с Windows UI, и добавить соответствующие пакеты. В большинстве случаев это простое добавление ссылки в NuGet. Никаких изменений в коде не требуется, если вы не использовали эти функции.
Для тех, кто хочет минимизировать размер развертывания, разделение пакетов — это значительный шаг вперед. Особенно это актуально для приложений, которые распространяются через магазины приложений или корпоративные порталы, где размер файла имеет значение.
Кого затронет и как
В первую очередь изменения затронут разработчиков, которые создают приложения для Windows с использованием WPF, Windows Forms, UWP или Windows Runtime. Им придется добавить дополнительные пакеты в свои проекты. Однако выигрыш в размере развертывания будет существенным, особенно для крупных приложений.
Разработчики кроссплатформенных приложений, которые используют Rx.NET, но не работают с Windows UI, получат преимущество автоматически: их приложения станут легче без каких-либо действий с их стороны. Это особенно важно для мобильных приложений, где каждый мегабайт на счету.
Для компаний, которые распространяют приложения через корпоративные каталоги, уменьшение размера означает более быструю установку и меньшее потребление дискового пространства. В масштабах парка устройств это может дать заметную экономию.
Что будет дальше
Команда Rx.NET продолжает развивать библиотеку, и разделение пакетов — это только первый шаг. В будущих версиях можно ожидать дальнейшей оптимизации размера и улучшения производительности. Возможно, появятся новые интеграции с другими платформами, но они будут выноситься в отдельные пакеты по аналогии с Windows UI.
Сейчас важно, чтобы разработчики, использующие Windows-специфичные функции, успели обновиться до Rx.NET 7.0 и добавить необходимые пакеты. Это не срочно, но при следующем обновлении зависимостей стоит учесть изменения.
Итог
Rx.NET 7.0 — это важное обновление, которое делает библиотеку более модульной и уменьшает размер приложений. Разделение поддержки Windows UI позволяет избавиться от лишних зависимостей, что особенно полезно для самодостаточных приложений. Разработчикам, использующим Windows-специфичные функции, потребуется добавить соответствующие пакеты, но это небольшая плата за значительное сокращение размера. Следите за обновлениями Rx.NET, чтобы быть в курсе дальнейших улучшений.