Difference between revisions of "Lazarus Packages/ru"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(36 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{Lazarus Packages}}
 
{{Lazarus Packages}}
 
----
 
<span style="color:#FF0000">ENG: '''AT THE MOMENT THIS PAGE IS UNDER TRANSLATION.''' <br /> RUS: '''В НАСТОЯЩИЙ МОМЕНТ СТРАНИЦА НАХОДИТСЯ В ПРОЦЕССЕ ПЕРЕВОДА.'''</span>
 
----
 
  
 
__TOC__
 
__TOC__
Line 42: Line 38:
 
</pre>
 
</pre>
  
== Пришедшее из Delphi ==
+
== Пришедшим из Delphi ==
  
 
Если вы знакомы с пакетами Delphi, прочитайте следующий параграф, потому что между пакетами Delphi и Lazarus есть некоторые важные различия.
 
Если вы знакомы с пакетами Delphi, прочитайте следующий параграф, потому что между пакетами Delphi и Lazarus есть некоторые важные различия.
Line 103: Line 99:
 
Чтобы создать файл lrs, запустите (где ''TMyComponent'' - это имя класса вашего компонента, а ''yourunit'' - имя модуля):
 
Чтобы создать файл lrs, запустите (где ''TMyComponent'' - это имя класса вашего компонента, а ''yourunit'' - имя модуля):
  
<syntaxhighlight> ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png</syntaxhighlight>
+
<syntaxhighlight lang=pascal> ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png</syntaxhighlight>
  
 
* Вам может понадобиться скомпилировать ''lazres'' при первом использовании. Просто откройте ''lazres.lpi'' в IDE и в меню нажмите run > build.
 
* Вам может понадобиться скомпилировать ''lazres'' при первом использовании. Просто откройте ''lazres.lpi'' в IDE и в меню нажмите run > build.
Line 109: Line 105:
 
{{Note| вы можете добавить более одного изображения в файл lrs, добавив имя файла изображения в конце. Например:<br /><br />
 
{{Note| вы можете добавить более одного изображения в файл lrs, добавив имя файла изображения в конце. Например:<br /><br />
  
<syntaxhighlight>  ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png TMyOtherCom.png ...</syntaxhighlight> }}
+
<syntaxhighlight lang=pascal>  ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png TMyOtherCom.png ...</syntaxhighlight> }}
  
 
Ниже приведен пример файла ''yourunit.lrs''.
 
Ниже приведен пример файла ''yourunit.lrs''.
  
<syntaxhighlight>LazarusResources.Add('TMyComponent','PNG',[
+
<syntaxhighlight lang=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
 
   #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
 
   +#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
Line 128: Line 124:
 
* Добавьте директиву включения [файла ресурсов] в YourUnit:
 
* Добавьте директиву включения [файла ресурсов] в YourUnit:
  
<syntaxhighlight>unit YourUnit;
+
<syntaxhighlight lang=pascal>unit YourUnit;
 
...
 
...
 
uses  
 
uses  
Line 148: Line 144:
 
Создайте 16-цветное растровое изображение 24x24 для каждого компонента. Затем создайте файл rc следующим образом:
 
Создайте 16-цветное растровое изображение 24x24 для каждого компонента. Затем создайте файл rc следующим образом:
  
<syntaxhighlight>TMYCOMPONENT1NAME  BITMAP  "pathtobitmap1//bitmap1.bmp"
+
<syntaxhighlight lang=pascal>TMYCOMPONENT1NAME  BITMAP  "pathtobitmap1//bitmap1.bmp"
 
TMYCOMPONENT2NAME  BITMAP  "pathtobitmap2//bitmap2.bmp"
 
TMYCOMPONENT2NAME  BITMAP  "pathtobitmap2//bitmap2.bmp"
 
....   
 
....   
Line 157: Line 153:
 
Пусть windres (Binutils) создаст текущий ресурс:
 
Пусть windres (Binutils) создаст текущий ресурс:
  
<syntaxhighlight> pathtowindres/windres -J rc -O res "MyPackageName.rc" "MyPackageName.dcr"</syntaxhighlight>
+
<syntaxhighlight lang=pascal> pathtowindres/windres -J rc -O res "MyPackageName.rc" "MyPackageName.dcr"</syntaxhighlight>
  
 
Добавьте в модуле регистрации пакета {$R *.dcr} сразу после ключевого слова <tt>implementation</tt> и скомпилируйте/установите пакет.
 
Добавьте в модуле регистрации пакета {$R *.dcr} сразу после ключевого слова <tt>implementation</tt> и скомпилируйте/установите пакет.
Line 242: Line 238:
 
Например:
 
Например:
  
<syntaxhighlight>{ This file was automatically created by Lazarus. Do not edit!
+
<syntaxhighlight lang=pascal>{ This file was automatically created by Lazarus. Do not edit!
 
   This source is only used to compile and install
 
   This source is only used to compile and install
 
   the package GTKOpenGL 1.0.
 
   the package GTKOpenGL 1.0.
Line 263: Line 259:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
* Then the compiler is called and the package is compiled to the output directory.
+
* Затем вызывается компилятор и пакет компилируется в выходной каталог.
* The IDE compares the current compiler options with the last one, which are stored in the .compiled file. If they differ the IDE cleans up the output directory and compiles the package with -B, telling the compiler to recompile everything it can. Differences in search paths and verbosity options do not trigger a clean up. Since 0.9.31 the IDE removes all files in the unit output directory on clean up if the output directory does not contain source files (listed in the package editor) and is not shared with required packages.
+
* Среда IDE сравнивает текущие параметры компилятора с последними, которые хранятся в файле .compiled. Если они различаются, IDE очищает выходной каталог и компилирует пакет с [флагом] -B, указывая компилятору перекомпилировать все, что может. Различия в путях поиска и параметрах вывода не приводят к очистке. Начиная с версии 0.9.31, среда IDE удаляет все файлы в выходном каталоге модуля при очистке, если выходной каталог не содержит исходных файлов (перечисленных в редакторе пакетов) и не используется совместно с необходимыми пакетами.
* After compilation (successful or not) the state file is created. The state file is put into the output directory. It has the name <packagename>.compiled and contains the information, how the package was compiled and if the compilation succeeded. This state file is used by the IDE to check if update is needed and if a full recompile (-B) is needed.
+
* После компиляции (успешной или нет) создается файл состояния. Файл состояния помещается в выходной каталог. Он имеет имя <packagename>.compiled и содержит информацию о том, как был скомпилирован пакет и удалось ли его собрать. Этот файл состояния используется в среде IDE для проверки необходимости обновления и необходимости полной перекомпиляции ([с флагом] -B).
  
For example: gtkopengl.compiled:
+
Например: gtkopengl.compiled:
  
 
<syntaxhighlight lang="xml"><?xml version="1.0"?>
 
<syntaxhighlight lang="xml"><?xml version="1.0"?>
Line 278: Line 274:
 
</CONFIG></syntaxhighlight>
 
</CONFIG></syntaxhighlight>
  
* The IDE opens all needed packages automatically. This means, it opens all installed packages, all packages marked for installation (auto install), all packages with an open Editor, all packages required by the project and all packages required by one of the other packages. Unneeded packages are automatically unloaded, when the IDE becomes idle.
+
* IDE автоматически открывает все необходимые пакеты. Это означает, что он открывает все установленные пакеты, все пакеты, помеченные для установки (автоматическая установка), все пакеты с открытым редактором, все пакеты, требуемые проектом, и все пакеты, требуемые одним из других пакетов. Ненужные пакеты автоматически выгружаются, когда IDE простаивает.
* The IDE never opens two packages with the same name at the same time. When the user opens another package file with the same name the IDE will ask if it should replace the old one.
+
* IDE никогда не открывает два пакета с одним и тем же именем одновременно. Когда пользователь открывает другой файл пакета с тем же именем, IDE спросит, должен ли он заменить старый.
* The IDE maintains two extra sets of packages: The 'installed' packages and the 'auto install' packages. The auto install packages will be linked into the IDE on next compile. It creates two new files in the config directory: staticpackages.inc and idemake.cfg. Then it calls 'make ide OPT=@/path/to/your/config/idemake.cfg' to compile itself.
+
* В среде IDE есть два дополнительных набора пакетов: 'installed'(«установленные») пакеты и 'auto install' пакеты («автоматической установки»). Пакеты автоматической установки будут связаны с IDE при следующей компиляции. Он создает два новых файла в каталоге config: staticpackages.inc и idemake.cfg. Затем они вызывают 'make ide OPT=@/path/to/your/config/idemake.cfg', чтобы скомпилировать самих себя.
  
== Package states ==
+
== Состояние пакета ==
  
A package can have none, one or several of the following states:
+
Пакет может не иметь ни одного, иметь один или несколько из следующих состояний:
  
* '''used''' - a package can be '''used''' by a project or package, i.e. it is required and listed in Project inspector or Package Editor respectively. When you open a project or package all '''used''' packages are automatically '''loaded''' by the IDE.
+
* '''used''' (используемый) - пакет может '''использоваться''' проектом или пакетом, т.е. он является обязательным и перечислен в Инспекторе проекта или Редакторе пакетов соответственно. Когда вы открываете проект или пакет, все '''используемые''' пакеты автоматически '''загружаются''' в IDE.
* '''loaded''' - When the IDE opens a .lpk file the package is loaded. The IDE knows its settings and files. The IDE automatically loads all '''used''' packages of a project and its '''installed''' packages. This does not load the package code, as the compiler and IDE do not support dynamic packages yet.
+
* '''loaded''' (загруженный) - Когда IDE открывает файл .lpk, пакет загружается. IDE знает свои настройки и файлы. Среда автоматически загружает все '''используемые''' пакеты проекта и свои '''установленные''' пакеты. Это не загружает код пакета, так как компилятор и IDE еще не поддерживают динамические пакеты.
* '''marked for installation''' - To run the package code inside the IDE, you need to rebuild the IDE and restart it. That means the first step is to '''mark''' the package '''for installation'''. Then rebuild the IDE and finally restart it.
+
* '''marked for installation''' (помеченный для установки) - Чтобы запустить код пакета внутри IDE, необходимо пересобрать IDE и перезапустить его. Это означает, что первым шагом будет '''пометить''' пакет '''для установки'''. Затем пересобрать IDE и, наконец, перезапустить ее.
* '''installed''' - The compiled code of the package is loaded and registered in the currently running IDE. If the IDE was able to locate the .lpk file it will be '''loaded'''.
+
* '''installed''' (установленный) - Скомпилированный код пакета загружается и регистрируется в текущей запущенной IDE. Если в среде IDE удалось найти файл .lpk, он будет '''загружен'''.
* '''uninstall on next start''' - The package is '''installed''', but will not be compiled into a new IDE. That means, when you rebuild the IDE and restart it, the package will no longer be '''installed'''. Keep in mind, that a package can be required indirectly by an installed package and thus will be installed as well.
+
* '''uninstall on next start''' (удаляемый при следующем запуске) - Пакет является '''установленным''', но не будет скомпилирован в новую среду IDE. Это означает, что когда вы пересоберете среду IDE и перезапустите ее, пакет больше не будет '''установлен'''. Имейте в виду, что пакет может быть косвенно запрошен [другим] установленным пакетом и, следовательно, будет также [опять] установлен.
  
== Hints and Tips ==
+
== Советы и подсказки ==
Please add any hints, tips or gotchas here.
+
Пожалуйста, добавляйте  здесь любые советы, подсказки или ошибки.
  
*To rename a package, use 'save as'.
+
*Чтобы переименовать пакет, используйте 'сохранить как'.
*You can add to every dependency the default filename. For instance you provide an example project for your package. When another programmer opens your example for the first time, the IDE does not know where the lpk file is. Simply right click on the dependency in the project inspector and 'Store file name as default for this dependency'. The file name is stored relative to the project. You can do the same for package dependencies.
+
*Вы можете добавить к каждой зависимости имя файла по умолчанию. Например, вы предоставляете пример проекта для вашего пакета. Когда другой программист впервые открывает ваш пример, IDE не знает, где находится файл lpk. Просто щелкните правой кнопкой мыши по зависимости в инспекторе проектов и выберите 'Store file name as default for this dependency' («Сохранить имя файла по умолчанию для этой зависимости»). Имя файла хранится относительно проекта. Вы можете сделать то же самое для зависимостей пакетов.
*Use package: to use all units of the package in the project, enable the '''Add package unit to uses section''' on package editor / Options / Usage. When the package is added to a project, the lpr uses section is extended with the package main unit. For example if the package implements a new graphic type, it only has initialization sections, but the no project code use it directly.
+
*Использование пакета: чтобы использовать все модули пакета в проекте, включите [опцию] '''Add package unit to uses section''' («Добавить модуль пакета в секцию uses») в package editor / Options / Usage. Когда пакет добавляется в проект, секция uses файла lpr расширяется основным модулем пакета. Например, если пакет реализует новый графический тип, он имеет только секцию initialization, но код проекта не использует его напрямую.
  
== Adding existing components to a Package ==
+
== Добавление существующих компонентов в пакет ==
  
If you want to add a file that contains a component to an existing package, you can do the following:
+
Если вы хотите добавить файл, содержащий компонент, в существующий пакет, вы можете сделать следующее:
  
* Open the package file
+
* Откройте файл пакета
* Click on the 'Add' file to add a new item to the package.
+
* Нажмите 'Add file', чтобы добавить новый элемент в пакет.
* Select the unit tab in the 'Add to package' dialog.
+
* Выберите вкладку модуля в диалоговом окне 'Add to package'.
* Choose the file to add.
+
* Выберите файл для добавления.
* Check the 'Has register procedure' if the unit contains a Register procedure. If you do not do this, the component(s) will not be shown on the component palette.  
+
* Проверьте [наличие] 'Has register procedure', если модуль содержит процедуру Register. Если вы этого не сделаете, компонент(ы) не будут отображаться в палитре компонентов.
* Click 'Add unit'.
+
* Нажмите 'Add unit'.
* Recompile and install the package.
+
* Пересоберите и установите пакет.
  
That's it. The component should now show on the component palette.
+
Вот и все. Теперь компонент должен отображаться в палитре компонентов.
  
== Create a package with a unit that has the same name as the package ==
+
== Создание пакета с модулем, имя которого совпадает с именем пакета ==
  
Normally the IDE auto creates the registration code into a unit with the same name as the package.
+
Обычно IDE автоматически создает регистрационный код внутри модуля с тем же именем, что и пакет.
If you want to name your package the same as an existing unit, for example because the package has only one unit, then you need at least Lazarus 0.9.29 and use this:
+
Если вы хотите присвоить вашему пакету имя, совпадающее с существующим модулем, например, потому что пакет содержит только один модуль, тогда вам нужен как минимум Lazarus 0.9.29 и использование этого:
  
*Make a backup of your unit ''mypackage.pas''.
+
*Сделайте резервную копию вашего модуля ''mypackage.pas''.
*Create the package ''mypackage.lpk'' normally and do not add the unit yet.
+
*Создайте пакет ''mypackage.lpk'' обычным способом и пока не добавляйте модуль.
*Add a new unit, for example ''mypackageall.pas''.
+
*Добавьте новый модуль, например, ''mypackageall.pas''.
*Select the unit ''mypackageall.pas'' in the package editor and right click for the popup menu.
+
*Выберите модуль ''mypackageall.pas'' в редакторе пакетов и щелкните правой кнопкой мыши для [вызова] всплывающего меню.
*Change ''File type'' to ''Main Unit''.
+
*Измените ''File type'' на ''Main Unit''.
*Now restore your unit ''mypackage.pas'' and add it to the package.
+
*Теперь восстановите ваш модуль ''mypackage.pas'' и добавьте его в пакет.
  
== The Register procedure ==
+
== Процедура регистрации ==
  
To show a component on the component palette, it must be registered in Lazarus. This is done in the 'Register' procedure.
+
Чтобы отобразить компонент на палитре компонентов, он должен быть зарегистрирован в Lazarus. Это делается в процедуре 'Register'.
This is a procedure that must appear in the interface section of the unit it is in, and must issue one or more RegisterComponent calls, as well as install property and component editors for the components.
+
Это процедура, которая должна появиться в секции интерфейса модуля, в котором она находится, и должна выполнить один или несколько вызовов RegisterComponent, а также установить редакторы свойств и компонентов для компонентов.
  
One or more Register procedures can be present in a package: in the package editor, you must indicate the units
+
В пакете может присутствовать одна или несколько процедур регистрации: в редакторе пакетов необходимо указать модули,
that have a 'register' procedure, so Lazarus knows which procedures it must call when the package is installed.
+
у которых есть процедура 'register', поэтому Lazarus знает, какие процедуры он должен вызывать при установке пакета.
  
There are 2 ways to mark a unit as having a register procedure:
+
Есть 2 способа пометить модуль, как имеющий процедуру регистрации:
  
* You can do this while adding the units to the package (see the 'Adding existing components to a package' section),  
+
* Вы можете сделать это при добавлении модулей в пакет (см. раздел [[Lazarus_Packages/ru#Добавление существующих компонентов в пакет|Добавление существующих компонентов в пакет]]),  
* or you can select the unit in the package dialog, and set the 'Register' checkbox in the details panel.
+
* или вы можете выбрать устройство в диалоговом окне пакета и пометить checkbox 'Register' на панели сведений.
  
Do not forget to recompile and install the package after changing the properties.
+
Не забудьте перекомпилировать и установить пакет после изменения свойств.
  
== Search paths ==
+
== Поиск путей ==
  
All search paths are stored relative to the directory of the .lpk file. If you use an absolute path you have either not understood packages or you don't care.
+
Все пути поиска хранятся относительно каталога файла .lpk. Если вы используете абсолютный путь, вы либо [ничего] не поняли [про] пакеты, либо вам все равно.
  
Each package has two types of search paths:
+
Каждый пакет имеет два типа путей поиска:
*Paths in the ''Options / Compiler Options'' are used to compile the package itself.
+
*Пути в ''Options / Compiler Options'' используются для компиляции самого пакета.
*Paths in the [[IDE_Window:_Package_Options|Options / Package Options / Usage]] are used by packages and projects that require this package. In other words these paths are added to the search paths of the project (or requiring package). Keep in mind that if project uses package A and that uses package B, the ''Usage'' options of B are appended to A '''and''' the project.
+
*Пути в [[IDE_Window:_Package_Options/ru#Использование (Usage)|Options / Package Options / Usage]] используются пакетами и проектами, которым требуется этот пакет. Другими словами, эти пути добавляются в пути поиска проекта (или требующего пакет). Имейте в виду, что если в проекте используется пакет A, а в нем используется пакет B, то параметры ''Usage'' [пакета] B добавляется [и] к [пакету] A, '''и''' к проекту.
  
Since 0.9.29 you can specify compiler options depending on the target platform.
+
Начиная с версии 0.9.29 вы можете указывать параметры компилятора в зависимости от целевой платформы.
  
==Your package provides a library, how to extend the linker search path in all your projects==
+
==Ваш пакет предоставляет библиотеку, как расширить путь поиска компоновщика во всех ваших проектах==
  
A package can define search paths that are added to packages and projects using it. See [[IDE_Window:_Package_Options|Options / Package Options / Usage]].
+
Пакет может определять пути поиска, которые добавляются во [все] пакеты и проекты, использующие [этот пакет]. См. [[IDE_Window:_Package_Options/ru#Использование (Usage)|Options / Package Options / Usage]].
  
== Design Time vs Run Time package ==
+
== Пакеты Design Time vs пакетов Run Time ==
  
There are four different types of packages.
+
Существует четыре разных типа пакетов.
# A '''design and runtime''' package can be installed in the IDE and can be used normally by projects. This is the default.
+
# Пакет '''design and runtime''' [(времени разработки и времени исполнения)] может быть установлен в IDE и может использоваться проектами в обычном режиме. Это по умолчанию.
# A '''design time''' package can be installed in the IDE and provides IDE extensions like new components, new file or project types, new menu items, new component or property editors, etc. Projects can use ''design time'' packages (i.e. they are listed in the project inspector requirements), but by default a design time package is not compiled into the project. That means project units cannot use units of the ''design time'' package. When a project uses such a package the IDE warns before opening a form of the project, so the user can install it first. To test a design time package outside the IDE you may want to use it in a test project. For this case you can change this in ''Project Options / Miscellaneous / Use design time packages''.  
+
# Пакет '''design time''' [(времени разработки)] может быть установлен в IDE и предоставляет расширения IDE, такие как новые компоненты, новые типы файлов или проектов, новые элементы меню, новые редакторы компонентов или свойств и т.д. Проекты могут использовать пакеты ''design time'' (т.е. они перечислены в требованиях инспектора проекта), но по умолчанию пакет времени разработки не компилируется в проект. Это означает, что модули проекта не могут использовать модули пакета ''design time''. Когда проект использует такой пакет, IDE предупреждает [об этом] перед открытием формы проекта, поэтому пользователь может установить [этот пакет] в первую очередь. Чтобы протестировать пакет времени разработки вне IDE, вы можете использовать его в тестовом проекте. Для этого случая вы можете изменить [стандартное поведение] в [разделе настроек проекта] ''Project Options / Miscellaneous / Use design time packages''.  
# A '''run time''' package can be used by projects. A user cannot install such a package directly (it is not listed). It cannot register things in the IDE. It can be used by ''design time'' packages, so it can be installed indirectly.
+
# Пакет '''run time''' [(времени исполнения)] может быть использован в проектах. Пользователь не может установить такой пакет напрямую (он не указан в списке). [Пакет времени исполнения] не может зарегистрировать сущности в IDE. Он может использоваться пакетами ''design time'', поэтому он может быть установлен косвенно.
# A '''run time only''' package can only be used by projects. It cannot be installed in the IDE, not even indirectly. For example if the package is incompatible with the core IDE packages like the LCL. Since 0.9.31.
+
# Пакет '''run time only''' [(только времени исполнения)] может использоваться только проектами. Он не может быть установлен в IDE, даже косвенно. Например, если пакет несовместим с основными пакетами IDE, такими как LCL. [Тип доступен, начиная с версии] 0.9.31.
  
  
===Typical scenario for a run time and design time package===
+
===Типичный сценарий для запуска пакета time и design time package===
You have a component library called ''Awesome'' and you want to write some IDE editors for some special properties. For example a property editor for the property Datafile which shows a TOpenDialog to let the user select a file. You can put the components into one run time package named ''AwesomeLaz.lpk''' and create another directory ''design'' for the design time package ''AwesomeIDELaz.lpk''. Move all units containing the IDE editors and registering stuff into the ''design'' directory. Add a dependency in AwesomeIDELaz to AwesomeLaz. Make sure they do not share units or search paths. For an example see ''components/turbopower_ipro/'': The run time package is ''turbopoweripro.lpk'' and the design time package is ''design/turbopoweriprodsgn.lpk''.
+
У вас есть библиотека компонентов с именем ''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''.
  
===For Delphians: I can not install a run time package, why not?===
+
===Для Дельфийцев: я не могу установить runtime пакет, с чего бы?===
  
'''Installing a package''' means compiling the whole code into the IDE. A '''run time''' package does not contain code for the IDE or maybe even bites it. In order to use a package in your project, simply open the package, right click on the package editor for the popup menu and click '''Add to project'''. Alternatively you can use ''View / Project Inspector''. The project inspector shows what packages are used by your project, you can add dependencies or delete them.
+
'''Установка пакета''' означает сборку всего кода в IDE. Пакет '''run time''' не содержит код для IDE или, возможно, даже кусает его. Чтобы использовать пакет в вашем проекте, просто откройте пакет, щелкните правой кнопкой мыши на редакторе пакетов для [вызова] всплывающего меню и нажмите '''Add to project'''. В качестве альтернативы вы можете использовать ''View / Project Inspector''. Инспектор проектов показывает, какие пакеты используются вашим проектом, вы можете добавить зависимости или удалить их.
  
===Examples===
+
===Примеры===
  
Example for extending the Usage / Units path.  
+
Пример для расширения Usage / Units path.
  
The tiOPF framework has the following directory layout, due to the fact that it compiles for FPC, Delphi 5-7, D2005 and D2006:
+
Платформа [http://tiopf.sourceforge.net/index.shtml tiOPF] имеет следующую структуру каталогов, поскольку она компилируется для FPC, Delphi 5-7, D2005 и D2006:
 
   
 
   
<pre>Source                <= full path \Programming\3rdParty\tiOPF\Source
+
<pre>Source                <= полный путь \Programming\3rdParty\tiOPF\Source
 
   \Compilers
 
   \Compilers
     \Delphi7          <= Delphi 7 package files live here
+
     \Delphi7          <= Delphi 7 файлы пакета находятся здесь
 
     \D2005
 
     \D2005
     \FPC              <= the tiOPF.lpk lived here
+
     \FPC              <= tiOPF.lpk находится здесь
   \Core                <= core unit files
+
   \Core                <= файлы модуля ядра
   \Options            <= optional unit file for extra features
+
   \Options            <= дополнительный файл модуля для специальных функций
 
   \GUI</pre>
 
   \GUI</pre>
  
Using this example, the following paths are included in the "Options - Usage - Units" editbox:
+
В этом примере в поле редактирования "Options - Usage - Units" включены следующие пути:
 
  "$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI"  
 
  "$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI"  
This search path will be added to whatever project uses this package. The default is $(PkgOutDir), which would add only the ppu files to the project. Adding more search paths has the effect that the .pas source files are found by the compiler a second time - once when compiling the package and once when compiling your project. Since package and project use different settings the compiler might create a second version of the ppu, which is put into your project's output directory. Then you have two ppu for one unit and then you can get strange errors. To avoid the duplication disable the compilation of the package, by setting it to compile only manually.
 
  
==Platform specific units==
+
Этот путь поиска будет добавлен в любой проект, использующий этот пакет. По умолчанию используется [макрос] $(PkgOutDir), который добавляет в проект только файлы ppu. Добавление дополнительных путей поиска приводит к тому, что исходные файлы .pas обнаруживаются компилятором второй раз - один раз при компиляции пакета и один раз при компиляции вашего проекта. Поскольку пакет и проект используют разные настройки, компилятор может создать вторую версию ppu, которая будет помещена в выходной каталог вашего проекта. Тогда у вас будет два процессора для одного устройства, а затем вы можете получить странные ошибки. Чтобы избежать дублирования, отключите компиляцию пакета, установив его для компиляции только вручную.
There are various ways to deal with separating platform-specific code:
+
 
 +
==Платформозависимые модули==
 +
Существуют различные способы разделения платформозависимого кода:
 +
 
 +
===Одна модуль на платформу, несколько модулей с одинаковым именем===
  
===One unit per platform, several units with same name===
+
Например, модуль ''myconnect.pas'' имеет две версии: одну для Windows и одну для  Unix/Linux/OSX/BSD. Идея состоит в том, чтобы поместить модули в разные подкаталоги и использовать макросы в путях поиска.
  
For example the unit ''myconnect.pas'' has two versions, one for Windows and one for Unix/Linux/OSX/BSD. The idea is to put the units into different sub directories and use macros in search paths.
+
*Создайте два подкаталога: '''win''' и '''unix'''.
 +
*Добавьте в инспекторе пакета в Options / Compiler options / Paths / Other пути к файлам модулей '''$(SrcOS)'''. SrcOS - это [[IDE_Macros_in_paths_and_filenames/ru|макрос]], который переносит [пути поиска в папку] ''win'' под Windows и [в папку] ''unix'' под Linux/OSX/BSD.
 +
*Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под [именем] '''win/myconnect.pas'''.
 +
*Если модуль не выбран в редакторе пакетов, выберите его.
 +
*Отключите '''use unit'''.
 +
*Создайте второй модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под [именем] '''unix/myconnect.pas'''.
 +
*Оставьте '''use unit''' включенным. Он будет использоваться один раз.
  
*Create two sub directories: '''win''' and '''unix'''.
+
===Один модуль только для одной платформы / условный модуль===
*Add to the package options / Compiler options / Paths / Other unit files the path '''$(SrcOS)'''. SrcOS is a [[IDE_Macros_in_paths_and_filenames|macro]], that translates to ''win'' under Windows and ''unix'' under Linux/OSX/BSD.
 
*Create a new package unit (package / Add / New file / Pascal unit) and save it under '''win/myconnect.pas'''.
 
*If the unit is not selected in the package editor, select it.
 
*Disable '''use unit'''.
 
*Create a second package unit (package / Add / New file / Pascal unit) and save it under '''unix/myconnect.pas'''.
 
*Keep the '''use unit''' enabled. It should be used once.
 
  
===One unit for only one platform / conditional unit===
+
Например: модуль ''mywin.pas'' должен использоваться только под Windows, т.е. он должен использоваться и компилироваться, только если определен флаг '''Windows'''.
  
For example: the unit ''mywin.pas'' should only be used under Windows, i.e. it should only be used and compiled if the flag '''Windows''' is defined.  
+
Идея состоит в том, чтобы использовать модуль косвенно, используя [директиву условной компиляции] IFDEF. В следующем примере показано, как модуль '''mywin.pas''' используется и компилируется только тогда, когда определен флаг '''Windows'''.
  
The idea is to use the unit indirectly using IFDEFs. The following example shows how the unit '''mywin.pas''' is only used and compiled when the flag '''Windows''' is defined.
+
*Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под [именем] '''mywin.pas'''.
 +
*Если модуль не выбран в редакторе пакета, выберите его.
 +
*Отключите '''use unit'''.
 +
*Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под [именем] '''mypkgcompile.pas'''.
 +
*Добавьте в секцию [модуля] '''mypkgcompile.pas''':
  
*Create a new package unit (package / Add / New file / Pascal unit) and save it under '''mywin.pas'''.
+
<syntaxhighlight lang=pascal>
*If the unit is not selected in the package editor, select it.
 
*Disable '''use unit'''.
 
*Create a new package unit (package / Add / New file / Pascal unit) and save it under '''mypkgcompile.pas'''.
 
*Add to the uses section of '''mypkgcompile.pas''':
 
<syntaxhighlight>
 
 
uses
 
uses
 
   Classes
 
   Classes
Line 424: Line 422:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Note: mypkgcompile will be compiled under all platforms. mywin will only be compiled under Windows. You don't need to use the unit mypkgcompile in your project.
+
{{Note| [Модуль] mypkgcompile будет компилироваться на всех платформах. [Модуль] mywin будет компилироваться только под Windows. Вам не нужно использовать модуль mypkgcompile в вашем проекте.}}
  
==Different versions of a package==
+
==Различные версии пакета==
  
If you work with different versions of a package, you can open at any time the other package file. The old package will be closed and the new one will be opened. Registered items will be transferred to the new package. For example the component palette still shows the components of the old package, with which the IDE was built. But right clicking on a component will show a menu item to open the recently used package.
+
Если вы работаете с разными версиями пакета, вы можете в любой момент открыть другой файл пакета. Старый пакет будет закрыт, а новый будет открыт. Зарегистрированные компоненты будут перенесены в новый пакет. Например, палитра компонентов по-прежнему будет показывать компоненты старого пакета, с которым была собрана среда IDE. Но по щелчку ПКМ по компоненту будут показаны пункты меню открытого в прошлый раз пакета.
  
You can specify the minimum, maximum version required. When the project is opened and there are multiple .lpk files the IDE will automatically open the one with the right version.
+
Вы можете указать минимальную, максимальную требуемую версию. Когда проект открыт и в нем есть несколько файлов .lpk, IDE автоматически откроет файл с нужной версией.
  
If you work with different projects that require different versions of a package (for example with different branches of the same package), you can define the preferred one in the dependencies. In the project inspector right click on the dependency and click on ''Set file name as preferred for this dependency''. When the project is opened, the preferred package will be opened. If there is already a package with the same name it will be replaced. This feature exists since 0.9.29.
+
Если вы работаете с разными проектами, для которых требуются разные версии пакета (например, с разными ветками одного и того же пакета), вы можете определить предпочтительный вариант в зависимостях. В инспекторе проекта щелкните правой кнопкой мыши по зависимости и выберите ''Set file name as preferred for this dependency'' [(«Установить имя файла как предпочтительное для этой зависимости»)]. При открытии проекта будет открыт и предпочтительный пакет. Если пакет с таким именем уже существует, он будет заменен. Эта функция существует с [версии] 0.9.29.<br />
  
 
[[File:SetDefaultPkDependency1.png]]
 
[[File:SetDefaultPkDependency1.png]]
  
[[IDE_Window:_Project_Inspector#Store_file_name_as_default_for_this_dependency|Project Inspector]]
+
См. также [[IDE_Window:_Project_Inspector/ru#Сохранить как имя файла по умолчанию для этой зависимости|Сохранить как имя файла по умолчанию для этой зависимости]]
  
===Example library with multiple lpk===
+
===Пример библиотеки с несколькими lpk===
  
A library has two lpk files, ''main.lpk'' and ''sub.lpk''. ''main'' depends on ''sub''. The library has two version ''1.0'' and ''2.0''.
+
Библиотека содержит два файла lpk: ''main.lpk'' и ''sub.lpk''. ''main'' зависит от ''sub''. Библиотека имеет две версии ''1.0'' и ''2.0''.
  
 
<pre>
 
<pre>
Line 451: Line 449:
 
</pre>
 
</pre>
  
When you open ''main.lpk 1.0'' for the first time, the IDE searches the package ''sub'' in its database and then it searches ''sub.lpk'' in the current folder. It finds ''sub.lpk 1.0'' and loads it.  
+
Когда вы открываете ''main.lpk 1.0'' в первый раз, IDE ищет пакет ''sub'' в своей базе данных, а затем ищет ''sub.lpk'' в текущей папке. Она находит ''sub.lpk 1.0'' и загружает его.  
  
When you then open ''main.lpk 2.0'', the IDE knows already a ''sub.lpk'', the version 1.0 and loads it. It does not load the ''sub.lpk 2.0''.
+
Когда вы открываете ''main.lpk 2.0'', IDE уже знает ''sub.lpk'' версии 1.0 и загружает его. Она не загрузит ''sub.lpk 2.0''.
  
There are two solutions:
+
Есть два решения:
  
====Using minimum, maximum version====
+
====Использование минимальной, максимальной версии====
  
You can set for each dependency the minimum and maximum version. When you set the minimum and maximum version of the dependency the following will happen:
+
Вы можете установить для каждой зависимости минимальную и максимальную версию. Когда вы устанавливаете минимальную и максимальную версию зависимости, происходит следующее:
The ''main 1.0'' and ''sub 1.0'' is open. You open ''main 2.0'' which requires ''sub >=2.0 and <=2.0''. The IDE unloads ''main 1.0'', loads ''main 2.0''. The ''sub 1.0'' does not fit, so the IDE searches for ''sub 2.0''. Again it first searches in its database and then in the current folder. It finds ''sub.lpk'' and loads ''sub 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''.
  
====Using preferred file name====
+
====Использование предпочтительного имени файла====
  
If the two lpk files are always distributed together you can use instead of minimum and maximum versions the '''preferred''' option.
+
Если два файла lpk всегда распространяются вместе, вы можете использовать вместо минимальной и максимальной версий опцию '''preferred''' [("предпочтительный")].
Open from trunk the ''main.lpk'' and ''sub.lpk'' to make sure that the right versions are loaded. Then right click on the dependency from ''main'' to ''sub'' and choose ''preferred file name''. The file name will appear to the right of the dependency.
+
Откройте ''main.lpk'' и ''sub.lpk'' из транка, чтобы убедиться, что загружены правильные версии. Затем щелкните правой кнопкой мыши на зависимости ''sub'' от ''main'' и выберите ''preferred file name'' [("предпочтительное имя файла")]. Имя файла появится справа от зависимости.
Repeat this step with the lpk files from version ''2.0''.
+
Повторите этот шаг с файлами lpk из версии ''2.0''.
The IDE will now always open the right ''sub.lpk''.
+
Теперь в среде IDE всегда будет открываться правильный ''sub.lpk''.
  
==Build modes==
+
==Режимы сборки==
  
You can add build modes to your package. See here for the various ways to achieve this:
+
Вы можете добавить режимы сборки в свой пакет. Смотрите здесь различные способы достижения этого:
  
 
[[Macros_and_Conditionals#Add_a_release.2Fdebug_mode|Build modes for packages]]
 
[[Macros_and_Conditionals#Add_a_release.2Fdebug_mode|Build modes for packages]]
  
==Compiling a package via make==
+
==Компиляция пакета через make==
  
The IDE can create a simple '''Makefile''' for a package via ''Package editor / More ... / Create Makefile''. The IDE creates the file '''Makefile.fpc''' and calls '''fpcmake''', which creates the Makefile. Since 0.9.29 the IDE also creates the file '''Makefile.compiled'''. If you are using a version control system like svn or git, add all three files to the repository:
+
В среде IDE можно создать простой '''Makefile''' для пакета с помощью ''Package editor / More ... / Create Makefile''. Среда IDE создает файл '''Makefile.fpc''' и вызывает '''fpcmake''', который создает Makefile. Начиная с [версии] 0.9.29 в среде IDE также создается файл '''Makefile.compiled'''. Если вы используете систему контроля версий, такую как svn или git, добавьте все три файла в репозиторий:
  
 
  Makefile
 
  Makefile
Line 483: Line 481:
 
  Makefile.compiled
 
  Makefile.compiled
  
You can now run '''make''' (e.g. open a console, cd to the package directory with the Makefile) to compile the package. This will compile the package and after successful compilation copy the '''Makefile.compiled''' to the unit output directory.
+
Теперь вы можете запустить '''make''' (например, откройте консоль, перейдите в каталог пакета с Makefile), чтобы скомпилировать пакет. Это скомпилирует пакет и после успешной компиляции скопирует Makefile.compiled в выходной каталог модуля.
  
'''Notes:'''
+
'''Заметки:'''
*The Makefile uses fixed paths, so it will '''not''' automatically adapt to changes as the IDE or lazbuild.
+
*Makefile использует фиксированные пути, поэтому он '''не''' будет автоматически адаптироваться к изменениям, как [это делают] IDE или lazbuild.
*The IDE can recreate the Makefile on every compile. Enable the option ''Package editor / Options / Compiler Options / Compilation / Create Makefile''.
+
*IDE может воссоздавать Makefile при каждой компиляции. [Для этого] включите параметр ''Package editor / Options / Compiler Options / Compilation / Create Makefile''.
*The Makefile does not contain the logic for conditionals and build macros, it contains the settings at the time of creation.
+
*Makefile не содержит логики для условных выражений и макросов сборки, он содержит настройки на момент создания.
*The macros $(TargetOS), $(TargetCPU) and $(LCLWidgetType) are replaced by %TargetOS%, %TargetCPU% and %LCLPlatform%. The Makefile has somelogic to set some default values. You can override them (e.g. make LCLPlatform=qt).
+
*Макросы $(TargetOS), $(TargetCPU) и $(LCLWidgetType) заменяются на %TargetOS%, %TargetCPU% и %LCLPlatform%. Makefile имеет некую логику для установки некоторых значений по умолчанию. Вы можете переопределить их (например, make LCLPlatform=qt).
*The Makefile.compiled file is copied by the Makefile after successful compilation to <PkgOutDir>/<PkgName>.compiled and is checked by the IDE (and lazbuild) if a package needs a recompile. For example the Lazarus binaries (Windows Installer, deb and rpm packages, OS X dmg package) are compiled via '''make''' and when the IDE is started and compiles a program it will not recompile used packages, unless the user set some extra flags. For example when the user changes the ''IDEBuildOptions'' via the ''Configure Build Lazarus dialog'' the IDE will detect the difference and recompile the package on next compile.
+
* Файл Makefile.compiled копируется [файлом] Makefile после успешной компиляции в <PkgOutDir>/<PkgName>.compiled и проверяется IDE (и lazbuild), если пакет требует перекомпиляции. Например, двоичные файлы Lazarus (установщик Windows, пакеты deb и rpm, пакет OS X dmg) компилируются с помощью  '''make''', и когда IDE запускается и компилирует программу, она не будет пересобирать используемые пакеты, если пользователь не установит некоторые дополнительные флаги. Например, когда пользователь изменяет ''IDEBuildOptions'' через ''Configure Build Lazarus dialog'', IDE обнаружит разницу и пересоберет пакет при следующей компиляции.
*If you forget to add the Makefile.compiled to svn you will get on make the error: /bin/cp: cannot stat `Makefile.compiled': No such file or directory
+
*Если вы забудете добавить Makefile.compiled в svn, вы получите сообщение об ошибке: /bin/cp: cannot stat `Makefile.compiled': No such file or directory [("/bin/cp: невозможно указать `Makefile.compiled ': Нет  такого файла или каталога")].
  
==Creating a closed sourced package==
+
==Создание закрытого пакета==
  
Goal: you want to publish a package, but you want to keep the source closed.
+
Цель: вы хотите опубликовать пакет, но хотите сохранить исходный код закрытым.
  
At the moment many IDE functions require the source; the IDE warns if the source of a unit is missing. Therefore you must publish the interface parts of the units, and the files the compiler creates (ppu and o files).  
+
На данный момент многие функции IDE требуют исходный код; среда IDE предупреждает, если исходный код модуля отсутствует. Поэтому вы должны опубликовать части интерфейса модулей и файлы, которые создает компилятор (файлы *.ppu и *.o).
  
Steps:
+
Этапы:
*Create a copy of the package folder and change this copy as follows.
+
*Создайте копию папки пакета и измените эту копию следующим образом.
*In the package editor / Options / IDE integration, set '''Update / Rebuild''' to '''Manual compilation'''.
+
*В инспекторе пакета в Package editor / Options / IDE integration установите '''Update / Rebuild''' в '''Manual compilation'''.
*Compile it once.
+
*Скомпилируйте его один раз.
*Delete the implementation sections of all units (i.e. everything after the implementation keyword of each unit including the initialization and finalization, only keeping the "end."). You can also remove the private section.
+
*Удалите секции implementation всех модулей (т.е. все после ключевого слова <tt>implementation</tt> каждого модуля, включая <tt>initialization</tt> и <tt>finalization</tt>, сохраняя только "<tt>end.</tt>"). Вы также можете удалить секцию <tt>private</tt>.
*Optional: You can use the publish package tool (Package Editor / More... / Publish Package) to create a zip of the package.
+
*Необязательно: Вы можете использовать инструмент распространения пакета (Package Editor / More ... / Publish Package), чтобы создать zip-пакет.
*You can delete the .compiled file, Makefile, rst files, lrt files. All other files in the output directory like .ppu, .o, .lfm files are needed by the compiler. The IDE needs the .lpk and the stripped .pas and .inc files.
+
*Вы можете удалить .compiled файл, Makefile, файлы rst, файлы lrt. Все остальные файлы в выходном каталоге, такие как .ppu, .o, .lfm, нужны для компилятора. Для среды IDE требуются файлы .lpk, а также файлы .pas и .inc.
  
There is a command line utility '''sourcecloser''' which alters the lpk and removes implementation sections. You can find it under ''lazarus/components/codetools/examples/sourcecloser.lpi''.
+
Существует утилита командной строки '''sourcecloser''', которая изменяет lpk и удаляет разделы реализации. Вы можете найти ее в ''lazarus/components/codetools/examples/sourcecloser.lpi''.
  
See also:
+
См. также:
* this article about FPC closed source units: [[Releasing units without source code]]
+
* эта статья о FPC с закрытым исходным кодом: [[Releasing_units_without_source_code/ru|Releasing units without source code]]
 
* Prezi: http://prezi.com/vpuyxca-qboq/how-to-create-a-closed-source-package-with-lazarus/
 
* Prezi: http://prezi.com/vpuyxca-qboq/how-to-create-a-closed-source-package-with-lazarus/
  
==Parallel Compilation==
+
==Параллельная компиляция==
  
The IDE and lazbuild compile packages in parallel (since 1.3). Each package is
+
IDE и lazbuild компилируют пакеты параллельно (начиная с версии 1.3). Каждый пакет по-прежнему компилируется одним вызовом fpc (однопоточным).
still compiled with one call of fpc (single threaded).
 
  
You can set the maximum number of parallel processes in ''Tools / Options / Messages Window''. By default it tries to guess the amount of
+
Вы можете установить максимальное количество параллельных процессов в ''Tools / Options / Messages Window''. По умолчанию среда пытается угадать количество ядер процессора с помощью функции ''GetSystemThreadCount'' в модуле ''UTF8Process''.
cpu cores with the function ''GetSystemThreadCount'' in unit ''UTF8Process''.
 
  
== See also ==
+
== См.также ==
  
* [[How To Write Lazarus Component]] - a tutorial about creating a new component.
+
* [[How_To_Write_Lazarus_Component/ru|How To Write Lazarus Component]] - учебник по созданию нового компонента.
 
* [[Install IDE packages without the IDE]]
 
* [[Install IDE packages without the IDE]]
 +
* [http://freepascal.ru/article/lazarus/20050530152619/ Создание визуальных компонент для Lazarus] - статья Сергея Смирнова на русскоязычном ресурсе

Latest revision as of 00:24, 19 February 2020

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) português (pt) русский (ru) slovenčina (sk)

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

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

packagegraph1.png

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

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

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

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

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

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

/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 есть некоторые важные различия.

  • Пакеты Lazarus'а - это не только динамические библиотеки. Они используются для обмена модулями между проектами и модульностью крупномасштабных проектов.
  • Иногда основной файл пакета Delphi называется "Пакетный проект". Этот термин не имеет смысла под Lazarus'ом.
  • Многие пакеты Delphi предоставляют один «пакетный проект» для каждой версии компилятора. Это вряд ли нужно при Лазаре. Но вы можете сделать это для совместимости с Delphi. Пакеты Lazarus содержат информацию о версии, и проекты могут определить, что им требуется, как минимум или максимум, конкретная версия пакета. Lazarus автоматически загрузит нужную версию.
  • Если модуль может быть не найден, под Delphi вы используете добавление каталога в глобальный путь поиска. Это имеет много недостатков при совместном использовании кода. Вот почему это не поддерживается Lazarus. Используйте вместо [этого] пакеты.

ЧаВо

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

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

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

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

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

  • Package->New Package... или File->New... -> Package -> Package
  • Откроется редактор пакетов

Package Maker

  • Откроется окно с заголовком "Save Package NewPackage 0.0(*.lpk)". Выберите каталог и имя для вашего нового пакета. Имя должно быть действительным идентификатором Паскаля с расширением .lpk.
  • Используйте кнопку Save в правом нижнем углу, чтобы сохранить пакет в выбранном вами каталоге и с вашим названием.
  • В зависимости от настроек [раздела] 'naming' в 'параметрах среды', среда IDE попросит вас сохранить файл в нижнем регистре. Ответьте утвердительно.

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

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

  • Используйте кнопку Add -> New component
  • Выберите компонент-предок в выпадающем списке. Например: TBevel.
  • Кликните Ok
  • Файл будет добавлен в пакет и открыт в редакторе
  • Установите пакет, нажав кнопку 'install' в верхней части редактора пакетов.
  • Lazarus сохранит пакет и спросит вас, нужно ли пересобирать IDE. Ответьте утвердительно.
  • Пакеты статически связаны, поэтому необходимо перезапустить IDE.
  • Перезапустите Lazarus и увидите ваш новый компонент в палитре компонентов (например: TBevel1 будет на странице 'Additional').
  • Если вы не видите свой новый компонент в палитре компонентов, скорее всего, вы используете не пересобранную версию Lazarus. Вы можете указать [каталог], где Lazarus [будет] пересобираться в меню:Tools -> Options -> Environment options -> Files -> Lazarus directory. Вместо непосредственного вызова lazarus вы также можете использовать startlazarus, который запускает только что созданный lazarus, например исполняемый файл lazarus в каталоге ~/.lazarus, если у вас нет прав на запись в каталог, внутрь которого был установлен [исполняемый файл] lazarus.

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

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

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

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

Также страница существует здесь: How_to_add_icons_my_package_components.

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

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

  • Размер файла PNG должен быть 24x24 px
  • Имя png должно быть именем класса нового компонента, регистр не имеет значения (например, tmyComponent.png для TMyComponent).

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

 ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png
  • Вам может понадобиться скомпилировать lazres при первом использовании. Просто откройте lazres.lpi в IDE и в меню нажмите run > build.

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

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

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

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
]);
  • Нажмите кнопку Add еще раз, перейдите на вкладку Add File, найдите файл yourunit.lrs и нажмите Ok. Это необходимо, чтобы среда IDE проверила этот файл на наличие изменений и перекомпилировала ваш пакет.
  • Добавьте директиву включения [файла ресурсов] в YourUnit:
unit YourUnit;
...
uses 
  ..., LResources;
...
implementation
...
initialization
  {$I yourunit.lrs}
end.

Light bulb  Примечание: You can include more than one lrs file, but each only once.

Вы можете включить [в код модуля вашего компонента] более одного файла lrs, но каждый [из них] только один раз.
  • Вот и все. Скомпилируйте или установите ваш пакет

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

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

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

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

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

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

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

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

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

  • Package->New Package или File->New... -> Package -> Standard Package
  • Откроется редактор пакетов
  • Используйте кнопку Save в левом верхнем углу. Выберите C:\MySharedUnits\MySharedUnits.lpk. Имя пакета не должно конфликтовать с каким-либо существующим модулем.
  • В зависимости от ваших настроек [подраздела] 'naming' в [разделе] 'environment options', среда IDE [возможно] попросит вас сохранить файл в нижнем регистре. Скажите да.
  • Теперь у вас есть пакет с именем MySharedUnits, сохраненный как C:\MySharedUnits\mysharedunits.lpk.
  • Добавление модулей: Add->Add Files->Add directory.
  • Появится диалоговое окно с каталогом C:\MySharedUnits и некоторыми включающими и исключающими фильтрами. Нажмите Ok, чтобы добавить все модули.
  • Модули теперь будут представлены списком. Нажмите Add files to package.
  • Файлы теперь добавлены в пакет. Нажмите Save.
  • Если для ваших модулей требуются только стандартные модули FPC, тогда вы можете просто нажать Compile. В противном случае смотрите ниже.

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

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

  • В редакторе пакетов вашего пакета нажмите Add -> New Requirement
  • Выберите как package name LCL
  • Нажмите Ok.
  • LCL теперь добавлен как Required Packages [(требуемые пакеты)]. Нажмите Save.

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

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

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

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

  • Откройте свой пакет. Например, через Package / Open recent package. В редакторе пакетов вашего пакета нажмите More ... / Add to project.
  • Или вы можете воспользоваться инспектором проекта:
    • Project / Project Inspector.
    • Нажмите на кнопку Add с плюсиком.
    • Перейдите на страницу New Requirement
    • Выберите в качестве имени пакета свой пакет
    • Нажмите Ok

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

  • Package -> New Package или File->New... -> Package -> Standard Package
    • Создает новый пакет.
  • Project -> Project Inspector
    • Здесь вы можете увидеть, какие пакеты требуются для открытого в данный момент проекта.
    • Вы можете добавить новые зависимости и удалить ненужные.
  • Run -> Compiler options -> Inherited
    • Здесь вы можете увидеть, какие параметры компилятора наследуются от какого пакета.
  • Package
    • Open package: Диалог показывает все открытые пакеты с их состоянием.
    • Open package file: Открывает файл .lpk.
    • Open package of current unit: Открывает файл .lpk, принадлежащий файлу в редакторе исходного кода.
    • Open recent package: Открывает ранее открывавшийся файл пакета (файл lpk).
    • Add active unit to a package: Добавляет в пакет модуль в редакторе исходного кода.
    • Package Graph: На графике пакетов показываются все открытые пакеты и их зависимости.
    • Configure installed packages: Редактирует список пакетов, установленных в IDE. [Позволяет] устанавливать или удалять несколько пакетов одновременно.

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

  • Чтобы удалить установленные компоненты, в меню IDE выберите Package > Configure. На следующем рисунке показан инструмент Installed Packages.

Installed Components

  • Выберите пакет, который вы хотите удалить, и нажмите Uninstall selection.

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

Теория

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

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

  • Среда IDE автоматически создает основной исходный файл (package1.pas). См. ниже. Файл lpk содержит информацию о необходимых пакетах, файлах, которые он использует, о том, как их скомпилировать, и о том, что необходимо для использования пакета другими пакетами/проектами. Каталог, в котором находится файл lpk, называется "package directory" [(«каталогом пакетов»)].
  • В среде IDE содержится список всех файлов пакетов (<каталог конфигурации>/packagelinks.xml). Каждый раз, когда пакет открывается в IDE, он будет добавляться в этот список. Когда пакет открыт, IDE автоматически открывает все необходимые пакеты через этот список.
  • Обычно пакет имеет исходный каталог с некоторыми модулями на паскале. И обычно там будет файл lpk. Пакет также имеет выходной каталог. По умолчанию это подкаталог 'lib/$(TargetCPU)-$(TargetOS)/' в каталоге пакета.
  • Перед компиляцией пакета IDE проверяет все необходимые пакеты, и, если они нуждаются в обновлении и имеют флаг автоматического обновления, они компилируются в первую очередь. Затем IDE создает основной исходный файл пакета. Если файл lpk был package1.lpk, то основным исходным файлом является package1.pas. Этот файл содержит все модули в секции uses плюс 'Register' procedure, которая вызывается в секции initialization.

Например:

{ 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.
  • Затем вызывается компилятор и пакет компилируется в выходной каталог.
  • Среда IDE сравнивает текущие параметры компилятора с последними, которые хранятся в файле .compiled. Если они различаются, IDE очищает выходной каталог и компилирует пакет с [флагом] -B, указывая компилятору перекомпилировать все, что может. Различия в путях поиска и параметрах вывода не приводят к очистке. Начиная с версии 0.9.31, среда IDE удаляет все файлы в выходном каталоге модуля при очистке, если выходной каталог не содержит исходных файлов (перечисленных в редакторе пакетов) и не используется совместно с необходимыми пакетами.
  • После компиляции (успешной или нет) создается файл состояния. Файл состояния помещается в выходной каталог. Он имеет имя <packagename>.compiled и содержит информацию о том, как был скомпилирован пакет и удалось ли его собрать. Этот файл состояния используется в среде IDE для проверки необходимости обновления и необходимости полной перекомпиляции ([с флагом] -B).

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

<?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 автоматически открывает все необходимые пакеты. Это означает, что он открывает все установленные пакеты, все пакеты, помеченные для установки (автоматическая установка), все пакеты с открытым редактором, все пакеты, требуемые проектом, и все пакеты, требуемые одним из других пакетов. Ненужные пакеты автоматически выгружаются, когда IDE простаивает.
  • IDE никогда не открывает два пакета с одним и тем же именем одновременно. Когда пользователь открывает другой файл пакета с тем же именем, IDE спросит, должен ли он заменить старый.
  • В среде IDE есть два дополнительных набора пакетов: 'installed'(«установленные») пакеты и 'auto install' пакеты («автоматической установки»). Пакеты автоматической установки будут связаны с IDE при следующей компиляции. Он создает два новых файла в каталоге config: staticpackages.inc и idemake.cfg. Затем они вызывают 'make ide OPT=@/path/to/your/config/idemake.cfg', чтобы скомпилировать самих себя.

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

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

  • used (используемый) - пакет может использоваться проектом или пакетом, т.е. он является обязательным и перечислен в Инспекторе проекта или Редакторе пакетов соответственно. Когда вы открываете проект или пакет, все используемые пакеты автоматически загружаются в IDE.
  • loaded (загруженный) - Когда IDE открывает файл .lpk, пакет загружается. IDE знает свои настройки и файлы. Среда автоматически загружает все используемые пакеты проекта и свои установленные пакеты. Это не загружает код пакета, так как компилятор и IDE еще не поддерживают динамические пакеты.
  • marked for installation (помеченный для установки) - Чтобы запустить код пакета внутри IDE, необходимо пересобрать IDE и перезапустить его. Это означает, что первым шагом будет пометить пакет для установки. Затем пересобрать IDE и, наконец, перезапустить ее.
  • installed (установленный) - Скомпилированный код пакета загружается и регистрируется в текущей запущенной IDE. Если в среде IDE удалось найти файл .lpk, он будет загружен.
  • uninstall on next start (удаляемый при следующем запуске) - Пакет является установленным, но не будет скомпилирован в новую среду IDE. Это означает, что когда вы пересоберете среду IDE и перезапустите ее, пакет больше не будет установлен. Имейте в виду, что пакет может быть косвенно запрошен [другим] установленным пакетом и, следовательно, будет также [опять] установлен.

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

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

  • Чтобы переименовать пакет, используйте 'сохранить как'.
  • Вы можете добавить к каждой зависимости имя файла по умолчанию. Например, вы предоставляете пример проекта для вашего пакета. Когда другой программист впервые открывает ваш пример, IDE не знает, где находится файл lpk. Просто щелкните правой кнопкой мыши по зависимости в инспекторе проектов и выберите 'Store file name as default for this dependency' («Сохранить имя файла по умолчанию для этой зависимости»). Имя файла хранится относительно проекта. Вы можете сделать то же самое для зависимостей пакетов.
  • Использование пакета: чтобы использовать все модули пакета в проекте, включите [опцию] Add package unit to uses section («Добавить модуль пакета в секцию uses») в package editor / Options / Usage. Когда пакет добавляется в проект, секция uses файла lpr расширяется основным модулем пакета. Например, если пакет реализует новый графический тип, он имеет только секцию initialization, но код проекта не использует его напрямую.

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

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

  • Откройте файл пакета
  • Нажмите 'Add file', чтобы добавить новый элемент в пакет.
  • Выберите вкладку модуля в диалоговом окне 'Add to package'.
  • Выберите файл для добавления.
  • Проверьте [наличие] 'Has register procedure', если модуль содержит процедуру Register. Если вы этого не сделаете, компонент(ы) не будут отображаться в палитре компонентов.
  • Нажмите 'Add unit'.
  • Пересоберите и установите пакет.

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

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

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

  • Сделайте резервную копию вашего модуля mypackage.pas.
  • Создайте пакет mypackage.lpk обычным способом и пока не добавляйте модуль.
  • Добавьте новый модуль, например, mypackageall.pas.
  • Выберите модуль mypackageall.pas в редакторе пакетов и щелкните правой кнопкой мыши для [вызова] всплывающего меню.
  • Измените File type на Main Unit.
  • Теперь восстановите ваш модуль mypackage.pas и добавьте его в пакет.

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

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

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

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

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

Поиск путей

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

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

  • Пути в Options / Compiler Options используются для компиляции самого пакета.
  • Пути в Options / Package Options / Usage используются пакетами и проектами, которым требуется этот пакет. Другими словами, эти пути добавляются в пути поиска проекта (или требующего пакет). Имейте в виду, что если в проекте используется пакет A, а в нем используется пакет B, то параметры Usage [пакета] B добавляется [и] к [пакету] A, и к проекту.

Начиная с версии 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:

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. Идея состоит в том, чтобы поместить модули в разные подкаталоги и использовать макросы в путях поиска.

  • Создайте два подкаталога: win и unix.
  • Добавьте в инспекторе пакета в Options / Compiler options / Paths / Other пути к файлам модулей $(SrcOS). SrcOS - это макрос, который переносит [пути поиска в папку] win под Windows и [в папку] unix под Linux/OSX/BSD.
  • Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под [именем] win/myconnect.pas.
  • Если модуль не выбран в редакторе пакетов, выберите его.
  • Отключите use unit.
  • Создайте второй модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под [именем] unix/myconnect.pas.
  • Оставьте use unit включенным. Он будет использоваться один раз.

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

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

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

  • Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под [именем] mywin.pas.
  • Если модуль не выбран в редакторе пакета, выберите его.
  • Отключите use unit.
  • Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под [именем] mypkgcompile.pas.
  • Добавьте в секцию [модуля] mypkgcompile.pas:
uses
  Classes
  {$IFDEF Windows}
  ,mywin
  {$ENDIF}
  ;
Light bulb  Примечание: [Модуль] mypkgcompile будет компилироваться на всех платформах. [Модуль] mywin будет компилироваться только под Windows. Вам не нужно использовать модуль mypkgcompile в вашем проекте.

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

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

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

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

SetDefaultPkDependency1.png

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

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

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

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 в выходной каталог модуля.

Заметки:

  • Makefile использует фиксированные пути, поэтому он не будет автоматически адаптироваться к изменениям, как [это делают] IDE или lazbuild.
  • IDE может воссоздавать Makefile при каждой компиляции. [Для этого] включите параметр Package editor / Options / Compiler Options / Compilation / Create Makefile.
  • Makefile не содержит логики для условных выражений и макросов сборки, он содержит настройки на момент создания.
  • Макросы $(TargetOS), $(TargetCPU) и $(LCLWidgetType) заменяются на %TargetOS%, %TargetCPU% и %LCLPlatform%. Makefile имеет некую логику для установки некоторых значений по умолчанию. Вы можете переопределить их (например, make LCLPlatform=qt).
  • Файл Makefile.compiled копируется [файлом] Makefile после успешной компиляции в <PkgOutDir>/<PkgName>.compiled и проверяется IDE (и lazbuild), если пакет требует перекомпиляции. Например, двоичные файлы Lazarus (установщик Windows, пакеты deb и rpm, пакет OS X dmg) компилируются с помощью make, и когда IDE запускается и компилирует программу, она не будет пересобирать используемые пакеты, если пользователь не установит некоторые дополнительные флаги. Например, когда пользователь изменяет IDEBuildOptions через Configure Build Lazarus dialog, IDE обнаружит разницу и пересоберет пакет при следующей компиляции.
  • Если вы забудете добавить Makefile.compiled в svn, вы получите сообщение об ошибке: /bin/cp: cannot stat `Makefile.compiled': No such file or directory [("/bin/cp: невозможно указать `Makefile.compiled ': Нет такого файла или каталога")].

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

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

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

Этапы:

  • Создайте копию папки пакета и измените эту копию следующим образом.
  • В инспекторе пакета в Package editor / Options / IDE integration установите Update / Rebuild в Manual compilation.
  • Скомпилируйте его один раз.
  • Удалите секции implementation всех модулей (т.е. все после ключевого слова implementation каждого модуля, включая initialization и finalization, сохраняя только "end."). Вы также можете удалить секцию private.
  • Необязательно: Вы можете использовать инструмент распространения пакета (Package Editor / More ... / Publish Package), чтобы создать zip-пакет.
  • Вы можете удалить .compiled файл, Makefile, файлы rst, файлы lrt. Все остальные файлы в выходном каталоге, такие как .ppu, .o, .lfm, нужны для компилятора. Для среды IDE требуются файлы .lpk, а также файлы .pas и .inc.

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

См. также:

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

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

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

См.также