Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

Lazarus Packages/ru

Deutsch · English · Español · Français · Português · Slovenčina · Русский · 日本語

Обзор системы пакетов Lazarus

Другие значения Package в комбинированных проектах FPC/Lazarus см. Packages(disambiguation).

Что такое пакет Lazarus?

Пакет Lazarus - это набор модулей и компонентов, содержащий информацию о том, как их можно скомпилировать и как они могут использоваться проектами или другими пакетами или IDE. Среда IDE автоматически компилирует пакеты, если некоторые из ее файлов изменены. В отличие от Delphi, пакеты не ограничиваются библиотеками и могут быть независимыми от ОС. (Library Packages - это специально скомпилированные библиотеки, используемые приложениями, IDE или обоими. Для пакетов Delphi Library требуется поддержка внутри компилятора, на которую в настоящий момент FPC не способен, и, конечно, эта магия зависит от ОС.)

В настоящее время компилятор Free Pascal поддерживает только статические пакеты, а не динамические пакеты. Поэтому вы должны перекомпилировать и перезапускать IDE каждый раз, когда пакет устанавливается или удаляется.

Пакет Lazarus идентифицируется/различается по имени и его версии.

Пакеты идеально подходят для обмена кодом между проектами.

Вот типичный макет каталога пакета Lazarus:

pascal
/home/user/pascal/pkg1/  - ???????????????????????? ??????????????, ?????????? ???? ???????????????????? ???????????????????? ?????????? ????????????
  pkg1.lpk               - ???????? ????????????
  pkg1.pas               - ???????? ???????????? ?????????????????????????? ?????????????????? IDE ?? ?????????????????? ???????????? ?????? ????????????????????
  apackageunit.pas       - ?????? ?????????? ????????????, ?????????????????? ???????????????????? ??????, ?????????????? ???? ?????????????????????? ?? ?????????????? ??????????????????????/????????????????
  aform.pas              - ???????? ?????????? ??????????
  aform.lfm              - ???????? ?????????? ?????????? ?????????? ??????????
  lib/i386-linux/        - ???????????????? ?????????????? ????????????. ?????????????? ?? ?????? ???????????????????? ?????????????????? ??????????????????????????
    pkg1.compiled        - ???????? ??????????????????, ???????????????????? ?????????????????? ????????, ?????? ?????????? ?????? ?????????????????????????? ?? ?????????????????? ??????
    pkg1.o
    apackageunit.ppu
    apackageunit.o
    aform.ppu
    aform.o
    aform.lfm

Пришедшим из Delphi

Если вы знакомы с пакетами Delphi, прочитайте следующий параграф, потому что между пакетами Delphi и Lazarus есть некоторые важные различия.

ЧаВо

В: Нужно ли устанавливать [любой] пакет?
О: Вам нужно устанавливать пакет только [в том случае], если он содержит элементы времени разработки, такие как компоненты для палитры компонентов IDE. Если вы не используете эти элементы, вам не нужно устанавливать пакет. Если вы хотите использовать пакет только в своем проекте, не устанавливайте его. Используйте инспектор проекта и добавьте зависимость [от него].

В: Я установил пакет, но IDE не находит модуль
О: Установка пакета означает, что пакет интегрирован в IDE, а не в ваш проект. Это отдельные вещи. Чтобы использовать пакет в вашем проекте, используйте Project -> Project Inspector -> Add -> New Requirement. И удалите пакет, если он не содержит каких-либо полезных свойств IDE.

Быстрый старт

Чтобы увидеть систему пакетов в действии и привыкнуть к ней, сделайте следующее:

Создание нового пакета

Package Maker\

Поздравляем: Вы только что создали свой первый пакет!

Добавление нового компонента

Поздравляем: Вы только что установили свой первый пакет с первым компонентом пакета.

Добавление иконки компонента

Иконки компонентов могут использовать ресурсы Lazarus или ресурсы FPC.

Использование ресурсов Lazarus'а

Также страница существует здесь: How to add icons my package components.

Идея состоит в том, чтобы создать png, преобразовать его в файл подключения lrs с помощью инструмента lazres и включить его. Начиная с версии 0.9.29 на странице нового компонента есть кнопка, которая делает это автоматически.

Вот подробности:

Чтобы создать файл lrs, запустите (где TMyComponent - это имя класса вашего компонента, а yourunit - имя модуля):

pascal
 ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png

Note: вы можете добавить более одного изображения в файл lrs, добавив имя файла изображения в конце. Например:
\

pascal
~/lazarus/tools/lazres yourunit.lrs TMyComponent.png TMyOtherCom.png ...

Ниже приведен пример файла yourunit.lrs.

pascal
LazarusResources.Add('TMyComponent','PNG',[
  #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#2#0#0#0'o'#21#170#175
  +#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
  +#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131
  +#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247
  +'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29
  +'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201
  +#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'
  +#174'B`'#130
]);
pascal
unit YourUnit;
...
uses 
  ..., LResources;
...
implementation
...
initialization
  {$I yourunit.lrs}
end.

Note: You can include more than one lrs file, but each only once. Вы можете включить [в код модуля вашего компонента] более одного файла lrs, но каждый [из них] только один раз.

Использование ресурсов FPC

Создайте 16-цветное растровое изображение 24x24 для каждого компонента. Затем создайте файл rc следующим образом:

pascal
TMYCOMPONENT1NAME  BITMAP  "pathtobitmap1//bitmap1.bmp"
TMYCOMPONENT2NAME  BITMAP  "pathtobitmap2//bitmap2.bmp"
....  
TMYCOMPONENTnNAME  BITMAP  "pathtobitmapn//bitmapn.bmp"

Обратите внимание, что двойные слеши (Linux) и двойные обратные слешы (Windows) используются в пути к растровому изображению. Желательно, чтобы имя файла было таким же, как и имя пакета с расширением rc, т.е. [в нашем случае было] MyPackageName.rc

Пусть windres (Binutils) создаст текущий ресурс:

pascal
 pathtowindres/windres -J rc -O res "MyPackageName.rc" "MyPackageName.dcr"

Добавьте в модуле регистрации пакета {$R *.dcr} сразу после ключевого слова implementation и скомпилируйте/установите пакет.

Создание пакета для ваших общих модулей

Допустим, у вас есть несколько модулей, которые вы хотите использовать в своих проектах. Поместите модули в отдельный каталог, например, C:\ MySharedUnits.

Добавление LCL в качестве зависимости

Если ваш пакет содержит формы или любой другой модуль LCL с графическим интерфейсом, то для него требуется пакет LCL.

Вы можете увидеть, что делает LCL, щелкнув в редакторе пакетов вашего пакета Compiler Options / Inherited.

Если вы используете только компоненты LCL без GUI, такие как fileutil, вы можете [вместо LCL] добавить в зависимости LCLBase

Использование вашего пакета в вашем проекте

Вам нужно добавить зависимость от проекта в ваш новый пакет. Есть несколько способов сделать это:

Элементы меню IDE для пакетов

Удаление пакетов

Если что-то пойдет не так с пакетом (например, каталог пакета будет удален без предварительной деинсталляции), Lazarus может не позволить вам удалить пакеты. Чтобы устранить проблему, в меню IDE выберите Tools > Build Lazarus. Lazarus пересоберет все пакеты и перезапустится. Теперь вы сможете удалить проблемные пакеты.

Теория

Каждый пакет Lazarus имеет файл .lpk. Пакет идентифицируется по имени и версии. Имя должно соответствовать имени файла lpk. Например:

Имя: Package1, Version: 1.0, Имя файла: /home/.../package1.lpk.

Например:

pascal
{ This file was automatically created by Lazarus. Do not edit!
   This source is only used to compile and install
   the package GTKOpenGL 1.0.
}
unit GTKOpenGL;

interface

uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;

implementation

procedure Register;
begin
  RegisterUnit('GTKGLArea', @GTKGLArea.Register);
end;

initialization
  RegisterPackage('GTKOpenGL', @Register);
end.

Например: gtkopengl.compiled:

xml
<?xml version="1.0"?>
<CONFIG>
  <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
  <Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1
    -Tlinux -gl -vewnhi -l -Fu../../../lcl/units
    -Fu../../../lcl/units/gtk -Fu../../../packager/units
    -Fu. -FElib/ gtkopengl.pas"/>
</CONFIG>

Состояние пакета

Пакет может не иметь ни одного, иметь один или несколько из следующих состояний:

Советы и подсказки

Пожалуйста, добавляйте здесь любые советы, подсказки или ошибки.

Добавление существующих компонентов в пакет

Если вы хотите добавить файл, содержащий компонент, в существующий пакет, вы можете сделать следующее:

Вот и все. Теперь компонент должен отображаться в палитре компонентов.

Создание пакета с модулем, имя которого совпадает с именем пакета

Обычно IDE автоматически создает регистрационный код внутри модуля с тем же именем, что и пакет. Если вы хотите присвоить вашему пакету имя, совпадающее с существующим модулем, например, потому что пакет содержит только один модуль, тогда вам нужен как минимум Lazarus 0.9.29 и использование этого:

Процедура регистрации

Чтобы отобразить компонент на палитре компонентов, он должен быть зарегистрирован в Lazarus. Это делается в процедуре 'Register'. Это процедура, которая должна появиться в секции интерфейса модуля, в котором она находится, и должна выполнить один или несколько вызовов RegisterComponent, а также установить редакторы свойств и компонентов для компонентов.

В пакете может присутствовать одна или несколько процедур регистрации: в редакторе пакетов необходимо указать модули, у которых есть процедура 'register', поэтому Lazarus знает, какие процедуры он должен вызывать при установке пакета.

Есть 2 способа пометить модуль, как имеющий процедуру регистрации:

Не забудьте перекомпилировать и установить пакет после изменения свойств.

Поиск путей

Все пути поиска хранятся относительно каталога файла .lpk. Если вы используете абсолютный путь, вы либо [ничего] не поняли [про] пакеты, либо вам все равно.

Каждый пакет имеет два типа путей поиска:

Начиная с версии 0.9.29 вы можете указывать параметры компилятора в зависимости от целевой платформы.

Ваш пакет предоставляет библиотеку, как расширить путь поиска компоновщика во всех ваших проектах

Пакет может определять пути поиска, которые добавляются во [все] пакеты и проекты, использующие [этот пакет]. См. Options / Package Options / Usage.

Пакеты Design Time vs пакетов Run Time

Существует четыре разных типа пакетов.

  1. Пакет design and runtime [(времени разработки и времени исполнения)] может быть установлен в IDE и может использоваться проектами в обычном режиме. Это по умолчанию.
  2. Пакет design time [(времени разработки)] может быть установлен в IDE и предоставляет расширения IDE, такие как новые компоненты, новые типы файлов или проектов, новые элементы меню, новые редакторы компонентов или свойств и т.д. Проекты могут использовать пакеты design time (т.е. они перечислены в требованиях инспектора проекта), но по умолчанию пакет времени разработки не компилируется в проект. Это означает, что модули проекта не могут использовать модули пакета design time. Когда проект использует такой пакет, IDE предупреждает [об этом] перед открытием формы проекта, поэтому пользователь может установить [этот пакет] в первую очередь. Чтобы протестировать пакет времени разработки вне IDE, вы можете использовать его в тестовом проекте. Для этого случая вы можете изменить [стандартное поведение] в [разделе настроек проекта] Project Options / Miscellaneous / Use design time packages.
  3. Пакет run time [(времени исполнения)] может быть использован в проектах. Пользователь не может установить такой пакет напрямую (он не указан в списке). [Пакет времени исполнения] не может зарегистрировать сущности в IDE. Он может использоваться пакетами design time, поэтому он может быть установлен косвенно.
  4. Пакет run time only [(только времени исполнения)] может использоваться только проектами. Он не может быть установлен в IDE, даже косвенно. Например, если пакет несовместим с основными пакетами IDE, такими как LCL. [Тип доступен, начиная с версии] 0.9.31.

Типичный сценарий для запуска пакета time и design time package

У вас есть библиотека компонентов с именем Awesome, и вы хотите написать некоторые редакторы IDE для некоторых специальных свойств. Например, редактор свойств для свойства Datafile, который показывает TOpenDialog, чтобы позволить пользователю выбрать файл. Вы можете поместить компоненты в один runtime пакет с именем AwesomeLaz.lpk и создать другой каталог design для designtime пакета AwesomeIDELaz.lpk. Переместите все модули, содержащие редакторы IDE и регистрирующие материалы, в каталог design. Добавьте зависимость в AwesomeIDELaz от AwesomeLaz. Убедитесь, что они не имеют общих модулей или путей поиска. Примеры см. в разделе components/turbopower_ipro/: runtime пакет - turbopoweripro.lpk и designtime пакет - design/turbopoweriprodsgn.lpk.

Для Дельфийцев: я не могу установить runtime пакет, с чего бы?

Установка пакета означает сборку всего кода в IDE. Пакет run time не содержит код для IDE или, возможно, даже кусает его. Чтобы использовать пакет в вашем проекте, просто откройте пакет, щелкните правой кнопкой мыши на редакторе пакетов для [вызова] всплывающего меню и нажмите Add to project. В качестве альтернативы вы можете использовать View / Project Inspector. Инспектор проектов показывает, какие пакеты используются вашим проектом, вы можете добавить зависимости или удалить их.

Примеры

Пример для расширения Usage / Units path.

Платформа tiOPF имеет следующую структуру каталогов, поскольку она компилируется для FPC, Delphi 5-7, D2005 и D2006:

pascal
Source                <= ???????????? ???????? \Programming\3rdParty\tiOPF\Source
  \Compilers
     \Delphi7          <= Delphi 7 ?????????? ???????????? ?????????????????? ??????????
     \D2005
     \FPC              <= tiOPF.lpk ?????????????????? ??????????
  \Core                <= ?????????? ???????????? ????????
  \Options             <= ???????????????????????????? ???????? ???????????? ?????? ?????????????????????? ??????????????
  \GUI

В этом примере в поле редактирования "Options - Usage - Units" включены следующие пути:

text
"$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI"

Этот путь поиска будет добавлен в любой проект, использующий этот пакет. По умолчанию используется [макрос] $(PkgOutDir), который добавляет в проект только файлы ppu. Добавление дополнительных путей поиска приводит к тому, что исходные файлы .pas обнаруживаются компилятором второй раз - один раз при компиляции пакета и один раз при компиляции вашего проекта. Поскольку пакет и проект используют разные настройки, компилятор может создать вторую версию ppu, которая будет помещена в выходной каталог вашего проекта. Тогда у вас будет два процессора для одного устройства, а затем вы можете получить странные ошибки. Чтобы избежать дублирования, отключите компиляцию пакета, установив его для компиляции только вручную.

Платформозависимые модули

Существуют различные способы разделения платформозависимого кода:

Одна модуль на платформу, несколько модулей с одинаковым именем

Например, модуль myconnect.pas имеет две версии: одну для Windows и одну для Unix/Linux/OSX/BSD. Идея состоит в том, чтобы поместить модули в разные подкаталоги и использовать макросы в путях поиска.

Один модуль только для одной платформы / условный модуль

Например: модуль mywin.pas должен использоваться только под Windows, т.е. он должен использоваться и компилироваться, только если определен флаг Windows.

Идея состоит в том, чтобы использовать модуль косвенно, используя [директиву условной компиляции] IFDEF. В следующем примере показано, как модуль mywin.pas используется и компилируется только тогда, когда определен флаг Windows.

pascal
uses
  Classes
  {$IFDEF Windows}
  ,mywin
  {$ENDIF}
  ;

Note: [Модуль] mypkgcompile будет компилироваться на всех платформах. [Модуль] mywin будет компилироваться только под Windows. Вам не нужно использовать модуль mypkgcompile в вашем проекте.

Различные версии пакета

Если вы работаете с разными версиями пакета, вы можете в любой момент открыть другой файл пакета. Старый пакет будет закрыт, а новый будет открыт. Зарегистрированные компоненты будут перенесены в новый пакет. Например, палитра компонентов по-прежнему будет показывать компоненты старого пакета, с которым была собрана среда IDE. Но по щелчку ПКМ по компоненту будут показаны пункты меню открытого в прошлый раз пакета.

Вы можете указать минимальную, максимальную требуемую версию. Когда проект открыт и в нем есть несколько файлов .lpk, IDE автоматически откроет файл с нужной версией.

Если вы работаете с разными проектами, для которых требуются разные версии пакета (например, с разными ветками одного и того же пакета), вы можете определить предпочтительный вариант в зависимостях. В инспекторе проекта щелкните правой кнопкой мыши по зависимости и выберите Set file name as preferred for this dependency [(«Установить имя файла как предпочтительное для этой зависимости»)]. При открытии проекта будет открыт и предпочтительный пакет. Если пакет с таким именем уже существует, он будет заменен. Эта функция существует с [версии] 0.9.29.

См. также Сохранить как имя файла по умолчанию для этой зависимости

Пример библиотеки с несколькими lpk

Библиотека содержит два файла lpk: main.lpk и sub.lpk. main зависит от sub. Библиотека имеет две версии 1.0 и 2.0.

pascal
trunk/
  main.lpk  version 2.0, requires sub
  sub.lpk   version 2.0
fixes/
  main.lpk  version 1.0, requires sub
  sub.lpk   version 1.0

Когда вы открываете main.lpk 1.0 в первый раз, IDE ищет пакет sub в своей базе данных, а затем ищет sub.lpk в текущей папке. Она находит sub.lpk 1.0 и загружает его.

Когда вы открываете main.lpk 2.0, IDE уже знает sub.lpk версии 1.0 и загружает его. Она не загрузит sub.lpk 2.0.

Есть два решения:

Использование минимальной, максимальной версии

Вы можете установить для каждой зависимости минимальную и максимальную версию. Когда вы устанавливаете минимальную и максимальную версию зависимости, происходит следующее: main 1.0 и sub 1.0 открываются. Вы открываете main 2.0, для которого требуется sub >=2.0 и <=2.0. IDE выгружает main 1.0, загружает main 2.0. sub 1.0 не подходит, поэтому в среде IDE выполняется поиск sub 2.0. Она снова сначала ищет в своей базе данных, а затем в текущей папке. Она находит sub.lpk и загружает sub 2.0.

Использование предпочтительного имени файла

Если два файла lpk всегда распространяются вместе, вы можете использовать вместо минимальной и максимальной версий опцию preferred [("предпочтительный")]. Откройте main.lpk и sub.lpk из транка, чтобы убедиться, что загружены правильные версии. Затем щелкните правой кнопкой мыши на зависимости sub от main и выберите preferred file name [("предпочтительное имя файла")]. Имя файла появится справа от зависимости. Повторите этот шаг с файлами lpk из версии 2.0. Теперь в среде IDE всегда будет открываться правильный sub.lpk.

Режимы сборки

Вы можете добавить режимы сборки в свой пакет. Смотрите здесь различные способы достижения этого:

Build modes for packages

Компиляция пакета через make

В среде IDE можно создать простой Makefile для пакета с помощью Package editor / More ... / Create Makefile. Среда IDE создает файл Makefile.fpc и вызывает fpcmake, который создает Makefile. Начиная с [версии] 0.9.29 в среде IDE также создается файл Makefile.compiled. Если вы используете систему контроля версий, такую как svn или git, добавьте все три файла в репозиторий:

text
Makefile
Makefile.fpc
Makefile.compiled

Теперь вы можете запустить make (например, откройте консоль, перейдите в каталог пакета с Makefile), чтобы скомпилировать пакет. Это скомпилирует пакет и после успешной компиляции скопирует Makefile.compiled в выходной каталог модуля.

Заметки:

Создание закрытого пакета

Цель: вы хотите опубликовать пакет, но хотите сохранить исходный код закрытым.

На данный момент многие функции IDE требуют исходный код; среда IDE предупреждает, если исходный код модуля отсутствует. Поэтому вы должны опубликовать части интерфейса модулей и файлы, которые создает компилятор (файлы *.ppu и *.o).

Этапы:

Существует утилита командной строки sourcecloser, которая изменяет lpk и удаляет разделы реализации. Вы можете найти ее в lazarus/components/codetools/examples/sourcecloser.lpi.

См. также:

Параллельная компиляция

IDE и lazbuild компилируют пакеты параллельно (начиная с версии 1.3). Каждый пакет по-прежнему компилируется одним вызовом fpc (однопоточным).

Вы можете установить максимальное количество параллельных процессов в Tools / Options / Messages Window. По умолчанию среда пытается угадать количество ядер процессора с помощью функции GetSystemThreadCount в модуле UTF8Process.

См.также


From the Free Pascal wiki, page "Lazarus Packages/ru", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Версия 3, последнее изменение: WikiArchive, .