Динамические пакеты
Возможность полной поддержки динамических пакетов для компилятора Free Pascal и IDE Lazarus наконец-то реализована. Эта функция давно ожидалась экосистемой, и теперь доступна для скачивания на официальном сайте.
Динамические пакеты позволяют создавать и устанавливать компоненты, элементы управления и расширения Lazarus за считаные секунды без пересборки всей IDE. Их также можно использовать в собственных программах для разработки и развёртывания плагинов, которые предоставляют нативные классы и типы Pascal через библиотеки динамических пакетов. Для поддержки этой функциональности в компилятор, его runtime и Lazarus IDE внесены многочисленные улучшения. Также созданы дополнительные расширения IDE для улучшения опыта работы с пакетами Lazarus.
Динамические пакеты реализованы как стандартные файлы общих библиотек для Linux, Windows и macOS. Они содержат дополнительные метаданные, сгенерированные компилятором, которые можно проверять и запрашивать с помощью новых модулей RTL. Runtime также включает механизмы для безопасного сохранения переменных потока и управления динамическими типами, такими как строки и динамические массивы, между программами и пакетами или между несколькими пакетами.
При развёртывании программы можно по-прежнему упаковать всё в один исполняемый файл. Или разделить на несколько динамических пакетов, которые можно заменять во время работы программы, обеспечивая систему плагинов.
Ограничения
Динамические пакеты имеют несколько ограничений. Во-первых, модуль, находящийся в пакете, не может иметь то же имя, что и сам пакет. Система пакетов была улучшена так, что сгенерированный файл исходного кода Pascal автоматически добавляет слово Package к имени пакета. Например, при создании пакета с названием ElectroTools.lpk файл исходного кода со списком всех модулей пакета будет назван ElectroToolsPackage.pas вместо ElectroTools.pas.
Другое ограничение заключается в том, что имена модулей должны быть уникальными во всех пакетах. Если кто-то другой написал модуль под названием Widgets, нельзя установить другой пакет, содержащий модуль с тем же именем. Нужно либо выбрать, какой пакет установить, либо переименовать один из конфликтующих модулей.
Динамические пакеты также больше по размеру, чем обычные общие библиотеки, поскольку они содержат карту всего внутри них. Удаление символов из динамического пакета удаляет метаданные, необходимые для его функционирования в качестве динамического пакета.
Улучшения RTL
type
TPackageType = record
{ The unit that declares the type }
UnitName: string;
{ The name of the type }
Name: string;
{ The kind of the type }
Kind: TTypeKind;
{ The RTTI of the type }
Info: PTypeInfo;
{ The class if Kind is tkClass, otherwise nil }
ClassType: TClass;
end;
Библиотека времени выполнения была расширена для поддержки динамических пакетов, включая метаданные, необходимые для проверки их содержимого, и механизмы, необходимые для безопасного управления динамическими типами и переменными потока через границы пакетов.
В RTL добавлен новый модуль DynPkgTypes.pas для работы с информацией из динамических пакетов. Те же надёжные сведения RTTI можно собрать из пакета для работы с его содержимым. В RTL достаточно функций для работы с динамическими пакетами, чтобы сделать всё необходимое, включая загрузку, перечисление, поиск и выгрузку пакетов во время выполнения.
Улучшения Lazarus
В IDE Lazarus внесены несколько улучшений для лучшего использования динамических пакетов.
Первое, что заметит пользователь при открытии Lazarus — новое окно прогресса, которое может появляться за пределами IDE. Когда изменяется исходный код, принадлежащий пакету, зарегистрированному в IDE, система обнаруживает изменения и автоматически перестраивает пакет перед запуском Lazarus. Во время этого процесса окно прогресса уведомляет об обнаруженных изменениях и перестройке пакета.
То же окно появляется при выборе перестройки всей IDE. Оно остаётся видимым и отображает информацию о текущей операции, включая приблизительное оставшееся время до перезагрузки IDE. Окно прогресса также появляется при добавлении или удалении пакетов, если операция занимает больше пяти секунд. Это может произойти при установке нескольких пакетов одновременно — ещё одна новая функция.
Другое улучшение — новое окно Packages, закреплённое справа по умолчанию. Оно отображает недавно открытые пакеты, и список сохраняется между сеансами Lazarus. Можно просматривать файлы в пакете и дважды щёлкнуть элемент, чтобы его открыть.
При открытии установленного пакета и нажатии кнопки Compile в его окне любые связанные элементы управления, компоненты или расширения обновляются за секунду или две. Это значительно ускоряет разработку, поскольку изменения, которые ранее требовали пересборки всей IDE, теперь применяются почти мгновенно.
Меню пакетов, в котором указаны доступные пакеты, также улучшено. Добавление или удаление пакетов теперь обновляет IDE без требования пересборки.
Параметры пакетов также были расширены. В разделе IDE Integrations теперь можно ограничить пакет определённой платформой или набором виджетов. Если пакет не соответствует текущим требованиям платформы или набора виджетов, он не будет отображаться в списке пакетов. IDE также будет игнорировать пакет при обнаружении изменений или при попытке его открыть.
Например, при разработке реализации TWinControl для COM интерфейса Windows IShellView можно ограничить пакет так, чтобы он был доступен только при работе Lazarus на Windows.
Другое улучшение, которое было создано для демонстрации возможностей динамических пакетов — новая функция преобразования форм и фреймов для расширений Lazarus. Она преобразует любую форму или фрейм в устанавливаемый элемент управления, который автоматически добавляется в палитру компонентов. Все элементы управления, события, методы и свойства копируются в новый элемент управления.
Это позволяет визуально проектировать и размещать новые элементы управления или легко повторно использовать существующие формы и фреймы в других проектах.
Примечание: при попытке собрать пакет, который в данный момент используется открытой формой, IDE попросит сохранить или закрыть форму перед сборкой пакета.
Все эти функции и другие доступны для скачивания прямо сейчас. Полные изменения в FPC и Lazarus зафиксированы в GitLab в ветке, названной dynamic packages.
Если возникнут проблемы, их можно сообщить через трекер проблем GitLab, связанный с указанными выше ветками. Для обсуждения динамических пакетов или вопросов можно использовать форум. Учитывайте, что модератор должен одобрить аккаунт перед созданием новых постов.
Помощь проекту
Если есть желание помочь с этим проектом, сайту нужны модераторы. Можно отправить приватное сообщение (sysrpl), если интересует участие в разработке.
Также есть сложности с работой на macOS и производством необходимых сборок. Если у кого-то есть M1 Macintosh, который он бы хотел пожертвовать, можно отправить приватное сообщение. Хотелось бы поработать над кодом компилятора, необходимым для поддержки динамических пакетов на архитектуре M1.