Разработчик sysrpl выпустил динамические пакеты для Free Pascal и Lazarus
Автор под ником sysrpl объявил о первом выпуске полной поддержки динамических пакетов для компилятора Free Pascal (FPC) и среды разработки Lazarus. По его словам, эта возможность давно нужна экосистеме, а теперь законченная реализация доступна для скачивания на сайте getlazarus.org. Все изменения в FPC и Lazarus закоммичены на GitLab в его форк-ветку под названием dynamic packages. В источнике нет сведений о включении этих изменений в официальные релизы Free Pascal или Lazarus, не указаны ни номер версии, ни дата выпуска.
Главная идея: динамические пакеты позволяют создавать и устанавливать компоненты, элементы управления и расширения Lazarus за секунды, не пересобирая всю IDE. Их можно использовать и в собственных программах, чтобы делать плагины, которые выставляют наружу нативные классы и типы Pascal через библиотеки динамических пакетов. Для этого автор доработал компилятор, его рантайм и сам Lazarus, а также написал дополнительные расширения IDE для работы с пакетами Lazarus.
Технически динамические пакеты реализованы как обычные разделяемые библиотеки для Linux, Windows и macOS. Компилятор добавляет в них метаданные, которые можно просматривать и опрашивать через новые модули RTL. Рантайм также получил механизмы для безопасного сохранения потоковых переменных и управления динамическими типами (строками и динамическими массивами) между программой и пакетами или между несколькими пакетами. При поставке программу по-прежнему можно собрать в один исполняемый файл, а можно разделить на несколько динамических пакетов, которые заменяются, пока программа работает; так получается система плагинов.
Ограничения. Во-первых, модуль внутри пакета не может называться так же, как сам пакет. Чтобы это упростить, автор изменил стандартную систему пакетов: сгенерированный Pascal-файл теперь получает к имени пакета приставку Package. Например, для пакета ElectroTools.lpk файл со списком модулей будет называться ElectroToolsPackage.pas, а не ElectroTools.pas. Во-вторых, имена модулей должны быть уникальны среди пакетов: если у кого-то есть модуль Widgets, второй пакет с таким же модулем установить нельзя, нужно выбрать один пакет или переименовать конфликтующий модуль. В-третьих, динамические пакеты больше обычных разделяемых библиотек, потому что содержат карту всего внутри себя; если пакет «обрезать» (strip), будут удалены метаданные, без которых он не работает как динамический пакет.
Дополнения в RTL. Добавлен модуль DynPkgTypes.pas для чтения информации из динамических пакетов, в нём есть запись TPackageType (имя модуля, имя типа, вид типа, RTTI и класс, если это класс). По словам автора, функций в RTL достаточно для всего необходимого: загрузки, перечисления, поиска и выгрузки пакетов во время работы программы.
Улучшения Lazarus. Появилось окно прогресса, которое может показываться вне IDE: когда меняется исходный код пакета, зарегистрированного в IDE, система обнаруживает правки и автоматически пересобирает пакет до запуска Lazarus. То же окно показывается при пересборке всей IDE, с оценкой оставшегося времени до перезапуска, а при добавлении или удалении пакетов, если операция длится больше пяти секунд. Теперь можно устанавливать сразу несколько пакетов. Новое окно Packages по умолчанию закреплено справа, хранит недавно открытые пакеты между сеансами и позволяет просматривать файлы пакета и открывать их двойным щелчком. Если открыть установленный пакет и нажать Compile, связанные элементы управления, компоненты и расширения обновляются за секунду-две; раньше такие изменения требовали пересборки всей IDE. Добавление и удаление пакетов теперь обновляет IDE без пересборки. В параметрах пакета в разделе IDE Integrations можно ограничить пакет конкретной платформой или набором виджетов (widgetset): неподходящий пакет не показывается в списке и игнорируется IDE. Пример из текста: пакет с реализацией TWinControl для COM-интерфейса Windows IShellView можно сделать доступным только при запуске Lazarus в Windows. Для демонстрации возможностей автор сделал функцию преобразования формы или фрейма в устанавливаемый элемент управления, автоматически добавляемый в палитру компонентов; в новый элемент копируются все элементы управления, события, методы и свойства. Если собирать пакет, который сейчас использует открытая форма, IDE попросит сохранить или закрыть форму.
Обратная связь и помощь. Об ошибках автор просит сообщать в трекер задач GitLab, обсуждать вопросы можно на форуме сайта (учётная запись создаётся только после одобрения модератором). Сайту нужны модераторы, желающим предлагается написать sysrpl в личные сообщения. Кроме того, автор испытывает трудности с работой на macOS и подготовкой сборок и просит пожертвовать ему Macintosh на чипе M1: он хочет доработать код компилятора для поддержки динамических пакетов на архитектуре M1.
Ключевые факты
- Первый выпуск полной поддержки динамических пакетов для Free Pascal и Lazarus: скачивание на getlazarus.org, исходники в форк-ветке dynamic packages на GitLab.
- Компоненты, элементы управления и расширения Lazarus устанавливаются за секунды без пересборки IDE; после нажатия Compile в окне установленного пакета обновление занимает секунду-две.
- Пакеты, обычные разделяемые библиотеки для Linux, Windows и macOS с метаданными; программу можно собрать в один файл либо разделить на заменяемые во время работы плагины.
- Ограничения: модуль не может называться как его пакет, имена модулей должны быть уникальны среди пакетов, а strip удаляет нужные метаданные.
- Автору нужны модераторы для форума и пожертвованный Mac на M1 для поддержки этой архитектуры.
Почему это важно
Для Pascal-мира установка нового компонента обычно означала пересборку всей IDE Lazarus. Динамические пакеты сокращают это до секунд, а для программ добавляют штатный путь к плагинам с заменой модулей на ходу. Автор называет возможность давно ожидаемой экосистемой. Это нишевый, но заметный для сообщества инструмент: изменения затрагивают и компилятор, и рантайм, и IDE.
Кому это важно
Разработчикам на Free Pascal и Lazarus, которые пишут и устанавливают компоненты и расширения IDE; авторам приложений, которым нужна архитектура с плагинами и заменой частей без перезапуска программы; тем, кто интересуется развитием компилятора и рантайма Pascal.
Как это применить
Сборку и изменения автор предлагает скачать с сайта getlazarus.org; полный набор правок лежит в его форк-ветке dynamic packages на GitLab. Номер версии и дата выпуска в источнике не указаны. На практике: создавайте пакеты как обычно, помня об ограничениях на имена (модуль не называется как пакет, имена модулей уникальны среди пакетов), не применяйте strip к динамическим пакетам и для чтения их содержимого используйте модуль DynPkgTypes.pas. Для проверки идеи можно сначала попробовать функцию преобразования формы или фрейма в устанавливаемый элемент управления.
Можно ли доверять
Источник, анонс самого автора на его сайте, написанный от первого лица; независимых проверок, замеров и тестов в тексте нет. Заявления о скорости («секунды», «секунда-две») даны без измерений. Нет сведений о реакции основных команд Free Pascal или Lazarus. Изменения лежат в личном форке, а не в официальных релизах. Это скорее заявка на новую возможность, чем подтверждённая стабильная функция.
Риски и подводные камни
Работа идёт в форке, и в источнике не сказано, что она принята в официальные ветки Free Pascal и Lazarus, поэтому будущая совместимость и поддержка неизвестны. Конфликты имён модулей между пакетами могут помешать установке сторонних пакетов. Динамические пакеты больше обычных разделяемых библиотек, а strip ломает их работу. Поддержка macOS на M1 не подтверждена: автор лишь хочет её сделать и просит пожертвовать устройство. Учётным записям на форуме требуется одобрение модератора.
«Динамические пакеты позволяют пользователям создавать и устанавливать компоненты, элементы управления и расширения Lazarus за секунды, без пересборки всей IDE.»
— sysrpl, автор анонса