Sign in Join
Wiki copytemporary

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" включены следующие пути:

"$(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, добавьте все три файла в репозиторий:

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.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.