Sign in Join
Wiki copytemporary

Lazarus Packages/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Обзор системы пакетов Lazarus
22
33Другие значения **Package** в комбинированных проектах FPC/Lazarus см. [[packages(disambiguation)|Packages(disambiguation)]].
44
5-<figure>
6-<img src="packagegraph1.png" title="packagegraph1.png" />
7-<figcaption>packagegraph1.png</figcaption>
8-</figure>
5+![](/wiki-images/5/52/Packagegraph1.png)
96
107## Что такое пакет Lazarus?
118
129Пакет Lazarus - это набор модулей и компонентов, содержащий информацию о том, как их можно скомпилировать и как они могут использоваться проектами или другими пакетами или IDE. Среда IDE автоматически компилирует пакеты, если некоторые из ее файлов изменены. В отличие от Delphi, пакеты не ограничиваются библиотеками и могут быть независимыми от ОС. ([[packages|Library Packages]] - это специально скомпилированные библиотеки, используемые приложениями, IDE или обоими. Для пакетов Delphi Library требуется поддержка внутри компилятора, на которую в настоящий момент FPC не способен, и, конечно, эта магия зависит от ОС.)
1310
1411В настоящее время компилятор [[Free Pascal]] поддерживает только статические пакеты, а не динамические пакеты. Поэтому вы должны перекомпилировать и перезапускать IDE каждый раз, когда пакет устанавливается или удаляется.
1512
1613Пакет Lazarus идентифицируется/различается по имени и его версии.
1714
1815Пакеты идеально подходят для обмена кодом между проектами.
1916
2017Вот типичный макет каталога пакета Lazarus:
2118
2219 /home/user/pascal/pkg1/ - произвольный каталог, часто он называется аналогично имени пакета
2320 pkg1.lpk - файл пакета
2421 pkg1.pas - этот модуль автоматически создается IDE и необходим только для компиляции
2522 apackageunit.pas - ваш общий модуль, выбирайте уникальное имя, которое не конфликтует с другими исходниками/пакетами
2623 aform.pas - ваша общая форма
2724 aform.lfm - файл формы вашей общей формы
2825 lib/i386-linux/ - выходной каталог пакета. Каталог и его содержимое создаются автоматически
2926 pkg1.compiled - файл состояния, содержащий параметры того, как пакет был скомпилирован в последний раз
3027 pkg1.o
3128 apackageunit.ppu
3229 apackageunit.o
3330 aform.ppu
3431 aform.o
3532 aform.lfm
3633
3734## Пришедшим из Delphi
3835
3936Если вы знакомы с пакетами Delphi, прочитайте следующий параграф, потому что между пакетами Delphi и Lazarus есть некоторые важные различия.
4037
4138- Пакеты Lazarus'а - это не только динамические библиотеки. Они используются для обмена модулями между проектами и модульностью крупномасштабных проектов.
4239- Иногда основной файл пакета Delphi называется "Пакетный проект". Этот термин не имеет смысла под Lazarus'ом.
4340- Многие пакеты Delphi предоставляют один «пакетный проект» для каждой версии компилятора. Это вряд ли нужно при Лазаре. Но вы можете сделать это для совместимости с Delphi. Пакеты Lazarus содержат информацию о версии, и проекты могут определить, что им требуется, как минимум или максимум, конкретная версия пакета. Lazarus автоматически загрузит нужную версию.
4441- Если модуль может быть не найден, под Delphi вы используете добавление каталога в глобальный путь поиска. Это имеет много недостатков при совместном использовании кода. Вот почему это не поддерживается Lazarus. Используйте вместо \[этого\] пакеты.
4542
4643## ЧаВо
4744
4845**В:** Нужно ли устанавливать \[любой\] пакет?\
4946**О:** Вам нужно устанавливать пакет **только** \[в том случае\], если он содержит элементы времени разработки, такие как компоненты для палитры компонентов IDE. Если вы не используете эти элементы, вам не нужно устанавливать пакет. Если вы хотите использовать пакет только в своем проекте, не устанавливайте его. Используйте инспектор проекта и добавьте зависимость \[от него\].
5047
5148**В:** Я установил пакет, но IDE не находит модуль\
5249**О:** Установка пакета означает, что пакет интегрирован в IDE, а не в ваш проект. Это отдельные вещи. Чтобы использовать пакет в вашем проекте, используйте Project -\> Project Inspector -\> Add -\> New Requirement. И удалите пакет, если он не содержит каких-либо полезных свойств IDE.
5350
5451## Быстрый старт
5552
5653Чтобы увидеть систему пакетов в действии и привыкнуть к ней, сделайте следующее:
5754
5855### Создание нового пакета
5956
6057- Package-\>New Package... или File-\>New... -\> Package -\> Package
6158- Откроется редактор пакетов
6259
6360![Package Maker](/wiki-images/3/37/How_to_write_lazarus_component_package_maker.png)\
6461
6562- Откроется окно с заголовком "Save Package NewPackage 0.0(*.lpk)". Выберите каталог и имя для вашего нового пакета. Имя должно быть действительным идентификатором Паскаля с расширением *.lpk*.
6663- Используйте кнопку *Save* в правом нижнем углу, чтобы сохранить пакет в выбранном вами каталоге и с вашим названием.
6764- В зависимости от настроек \[раздела\] 'naming' в 'параметрах среды', среда IDE попросит вас сохранить файл в нижнем регистре. Ответьте утвердительно.
6865
6966Поздравляем: Вы только что создали свой первый пакет!
7067
7168### Добавление нового компонента
7269
7370- Используйте кнопку Add -\> New component
7471- Выберите компонент-предок в выпадающем списке. Например: TBevel.
7572- Кликните Ok
7673- Файл будет добавлен в пакет и открыт в редакторе
7774- Установите пакет, нажав кнопку 'install' в верхней части редактора пакетов.
7875- Lazarus сохранит пакет и спросит вас, нужно ли пересобирать IDE. Ответьте утвердительно.
7976- Пакеты статически связаны, поэтому необходимо перезапустить IDE.
8077- Перезапустите Lazarus и увидите ваш новый компонент в палитре компонентов (например: TBevel1 будет на странице 'Additional').
8178- Если вы не видите свой новый компонент в палитре компонентов, скорее всего, вы используете не пересобранную версию Lazarus. Вы можете указать \[каталог\], где Lazarus \[будет\] пересобираться в меню:Tools -\> Options -\> Environment options -\> Files -\> Lazarus directory. Вместо непосредственного вызова lazarus вы также можете использовать [[startlazarus]], который запускает только что созданный lazarus, например исполняемый файл lazarus в каталоге ~/.lazarus, если у вас нет прав на запись в каталог, внутрь которого был установлен \[исполняемый файл\] lazarus.
8279
8380Поздравляем: Вы только что установили свой первый пакет с первым компонентом пакета.
8481
8582### Добавление иконки компонента
8683
8784Иконки компонентов могут использовать ресурсы Lazarus или ресурсы FPC.
8885
8986#### Использование ресурсов Lazarus'а
9087
9188Также страница существует здесь: [[How to add icons my package components]].
9289
9390Идея состоит в том, чтобы создать png, преобразовать его в файл подключения lrs с помощью инструмента [[lazres]] и включить его. Начиная с версии 0.9.29 на странице нового компонента есть кнопка, которая делает это автоматически.
9491
9592Вот подробности:
9693
9794- Размер файла PNG должен быть 24x24 px
9895- Имя png должно быть *именем класса* нового компонента, регистр не имеет значения (например, *tmyComponent.png* для *TMyComponent*).
9996
10097Чтобы создать файл lrs, запустите (где *TMyComponent* - это имя класса вашего компонента, а *yourunit* - имя модуля):
10198
10299``` pascal
103100 ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png
104101```
105102
106103- Вам может понадобиться скомпилировать *lazres* при первом использовании. Просто откройте *lazres.lpi* в IDE и в меню нажмите run \> build.
107104
108105> **Note:** вы можете добавить более одного изображения в файл lrs, добавив имя файла изображения в конце. Например:\
109106> \
110107>
111108> ``` pascal
112109> ~/lazarus/tools/lazres yourunit.lrs TMyComponent.png TMyOtherCom.png ...
113110> ```
114111
115112Ниже приведен пример файла *yourunit.lrs*.
116113
117114``` pascal
118115LazarusResources.Add('TMyComponent','PNG',[
119116 #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
120117 +#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
121118 +#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131
122119 +#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247
123120 +'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29
124121 +'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201
125122 +#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'
126123 +#174'B`'#130
127124]);
128125```
129126
130127- Нажмите кнопку Add еще раз, перейдите на вкладку Add File, найдите файл yourunit.lrs и нажмите Ok. Это необходимо, чтобы среда IDE проверила этот файл на наличие изменений и перекомпилировала ваш пакет.
131128
132129- Добавьте директиву включения \[файла ресурсов\] в YourUnit:
133130
134131``` pascal
135132unit YourUnit;
136133...
137134uses
138135 ..., LResources;
139136...
140137implementation
141138...
142139initialization
143140 {$I yourunit.lrs}
144141end.
145142```
146143
147144> **Note:** You can include more than one lrs file, but each only once. Вы можете включить \[в код модуля вашего компонента\] более одного файла lrs, но каждый \[из них\] только один раз.
148145
149146- Вот и все. Скомпилируйте или установите ваш пакет
150147
151148#### Использование ресурсов FPC
152149
153150Создайте 16-цветное растровое изображение 24x24 для каждого компонента. Затем создайте файл rc следующим образом:
154151
155152``` pascal
156153TMYCOMPONENT1NAME BITMAP "pathtobitmap1//bitmap1.bmp"
157154TMYCOMPONENT2NAME BITMAP "pathtobitmap2//bitmap2.bmp"
158155....
159156TMYCOMPONENTnNAME BITMAP "pathtobitmapn//bitmapn.bmp"
160157```
161158
162159Обратите внимание, что двойные слеши (Linux) и двойные обратные слешы (Windows) используются в пути к растровому изображению. Желательно, чтобы имя файла было таким же, как и имя пакета с расширением rc, т.е. \[в нашем случае было\] MyPackageName.rc
163160
164161Пусть windres (Binutils) создаст текущий ресурс:
165162
166163``` pascal
167164 pathtowindres/windres -J rc -O res "MyPackageName.rc" "MyPackageName.dcr"
168165```
169166
170167Добавьте в модуле регистрации пакета {\$R *.dcr} сразу после ключевого слова `implementation` и скомпилируйте/установите пакет.
171168
172169### Создание пакета для ваших общих модулей
173170
174171Допустим, у вас есть несколько модулей, которые вы хотите использовать в своих проектах. Поместите модули в отдельный каталог, например, *C:\\ MySharedUnits*.
175172
176173- Package-\>New Package или File-\>New... -\> Package -\> Standard Package
177174- Откроется редактор пакетов
178175- Используйте кнопку Save в левом верхнем углу. Выберите *C:\MySharedUnits\MySharedUnits.lpk*. Имя пакета не должно конфликтовать с каким-либо существующим модулем.
179176- В зависимости от ваших настроек \[подраздела\] 'naming' в \[разделе\] 'environment options', среда IDE \[возможно\] попросит вас сохранить файл в нижнем регистре. Скажите *да*.
180177- Теперь у вас есть пакет с именем *MySharedUnits*, сохраненный как *C:\MySharedUnits\mysharedunits.lpk*.
181178- Добавление модулей: *Add-\>Add Files-\>Add directory*.
182179- Появится диалоговое окно с каталогом *C:\MySharedUnits* и некоторыми включающими и исключающими фильтрами. Нажмите *Ok*, чтобы добавить все модули.
183180- Модули теперь будут представлены списком. Нажмите *Add files to package*.
184181- Файлы теперь добавлены в пакет. Нажмите *Save*.
185182- Если для ваших модулей требуются только стандартные модули FPC, тогда вы можете просто нажать *Compile*. В противном случае смотрите ниже.
186183
187184### Добавление LCL в качестве зависимости
188185
189186Если ваш пакет содержит формы или любой другой модуль LCL с графическим интерфейсом, то для него требуется пакет LCL.
190187
191188- В редакторе пакетов вашего пакета нажмите *Add -\> New Requirement*
192189- Выберите как *package name* *LCL*
193190- Нажмите *Ok*.
194191- LCL теперь добавлен как Required Packages \[(требуемые пакеты)\]. Нажмите *Save*.
195192
196193Вы можете увидеть, что делает LCL, щелкнув в редакторе пакетов вашего пакета *Compiler Options / Inherited*.
197194
198195Если вы используете только компоненты LCL без GUI, такие как [[fileutil]], вы можете \[вместо LCL\] добавить в зависимости *LCLBase*
199196
200197### Использование вашего пакета в вашем проекте
201198
202199Вам нужно добавить зависимость от проекта в ваш новый пакет. Есть несколько способов сделать это:
203200
204201- Откройте свой пакет. Например, через *Package / Open recent package*. В редакторе пакетов вашего пакета нажмите *More ... / Add to project*.
205202- Или вы можете воспользоваться инспектором проекта:
206203 - *Project / Project Inspector*.
207204 - Нажмите на кнопку *Add* с плюсиком.
208205 - Перейдите на страницу *New Requirement*
209206 - Выберите в качестве имени пакета свой пакет
210207 - Нажмите Ok
211208
212209## Элементы меню IDE для пакетов
213210
214211- Package -\> New Package **или** File-\>New... -\> Package -\> Standard Package
215212 - Создает новый пакет.
216213- Project -\> Project Inspector
217214 - Здесь вы можете увидеть, какие пакеты требуются для открытого в данный момент проекта.
218215 - Вы можете добавить новые зависимости и удалить ненужные.
219216- Run -\> Compiler options -\> Inherited
220217 - Здесь вы можете увидеть, какие параметры компилятора наследуются от какого пакета.
221218- Package
222219 - **Open package**: Диалог показывает все открытые пакеты с их состоянием.
223220 - **Open package file**: Открывает файл .lpk.
224221 - **Open package of current unit**: Открывает файл .lpk, принадлежащий файлу в редакторе исходного кода.
225222 - **Open recent package**: Открывает ранее открывавшийся файл пакета (файл lpk).
226223 - **Add active unit to a package**: Добавляет в пакет модуль в редакторе исходного кода.
227224 - **Package Graph**: На графике пакетов показываются все открытые пакеты и их зависимости.
228225 - **Configure installed packages**: Редактирует список пакетов, установленных в IDE. \[Позволяет\] устанавливать или удалять несколько пакетов одновременно.
229226
230227### Удаление пакетов
231228
232229- Чтобы удалить установленные компоненты, в меню IDE выберите Package \> Configure. На следующем рисунке показан инструмент Installed Packages.
233230
234-<figure>
235-<img src="How_to_write_lazarus_component_installed_components.png" title="Installed Components" />
236-<figcaption>Installed Components</figcaption>
237-</figure>
231+![](/wiki-images/0/0e/How_to_write_lazarus_component_installed_components.png)
238232
239233- Выберите пакет, который вы хотите удалить, и нажмите Uninstall selection.
240234
241235Если что-то пойдет не так с пакетом (например, каталог пакета будет удален без предварительной деинсталляции), Lazarus может не позволить вам удалить пакеты. Чтобы устранить проблему, в меню IDE выберите Tools \> Build Lazarus. Lazarus пересоберет все пакеты и перезапустится. Теперь вы сможете удалить проблемные пакеты.
242236
243237## Теория
244238
245239Каждый пакет Lazarus имеет файл .lpk. Пакет идентифицируется по имени и версии. Имя должно соответствовать имени файла lpk. Например:
246240
247241`Имя: Package1, Version: 1.0, Имя файла: /home/.../package1.lpk.`
248242
249243- Среда IDE автоматически создает основной исходный файл (package1.pas). См. ниже. Файл lpk содержит информацию о необходимых пакетах, файлах, которые он использует, о том, как их скомпилировать, и о том, что необходимо для использования пакета другими пакетами/проектами. Каталог, в котором находится файл lpk, называется "package directory" \[(«каталогом пакетов»)\].
250244- В среде IDE содержится список всех файлов пакетов (\<каталог конфигурации\>/packagelinks.xml). Каждый раз, когда пакет открывается в IDE, он будет добавляться в этот список. Когда пакет открыт, IDE автоматически открывает все необходимые пакеты через этот список.
251245- Обычно пакет имеет исходный каталог с некоторыми модулями на паскале. И обычно там будет файл lpk. Пакет также имеет выходной каталог. По умолчанию это подкаталог 'lib/\$(TargetCPU)-\$(TargetOS)/' в каталоге пакета.
252246- Перед компиляцией пакета IDE проверяет все необходимые пакеты, и, если они нуждаются в обновлении и имеют флаг автоматического обновления, они компилируются в первую очередь. Затем IDE создает основной исходный файл пакета. Если файл lpk был package1.lpk, то основным исходным файлом является package1.pas. Этот файл содержит все модули в секции uses плюс [[Register (package)|'Register' procedure]], которая вызывается в секции initialization.
253247
254248Например:
255249
256250``` pascal
257251{ This file was automatically created by Lazarus. Do not edit!
258252 This source is only used to compile and install
259253 the package GTKOpenGL 1.0.
260254}
261255unit GTKOpenGL;
262256
263257interface
264258
265259uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;
266260
267261implementation
268262
269263procedure Register;
270264begin
271265 RegisterUnit('GTKGLArea', @GTKGLArea.Register);
272266end;
273267
274268initialization
275269 RegisterPackage('GTKOpenGL', @Register);
276270end.
277271```
278272
279273- Затем вызывается компилятор и пакет компилируется в выходной каталог.
280274- Среда IDE сравнивает текущие параметры компилятора с последними, которые хранятся в файле .compiled. Если они различаются, IDE очищает выходной каталог и компилирует пакет с \[флагом\] -B, указывая компилятору перекомпилировать все, что может. Различия в путях поиска и параметрах вывода не приводят к очистке. Начиная с версии 0.9.31, среда IDE удаляет все файлы в выходном каталоге модуля при очистке, если выходной каталог не содержит исходных файлов (перечисленных в редакторе пакетов) и не используется совместно с необходимыми пакетами.
281275- После компиляции (успешной или нет) создается файл состояния. Файл состояния помещается в выходной каталог. Он имеет имя \<packagename\>.compiled и содержит информацию о том, как был скомпилирован пакет и удалось ли его собрать. Этот файл состояния используется в среде IDE для проверки необходимости обновления и необходимости полной перекомпиляции (\[с флагом\] -B).
282276
283277Например: gtkopengl.compiled:
284278
285279``` xml
286280<?xml version="1.0"?>
287281<CONFIG>
288282 <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
289283 <Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1
290284 -Tlinux -gl -vewnhi -l -Fu../../../lcl/units
291285 -Fu../../../lcl/units/gtk -Fu../../../packager/units
292286 -Fu. -FElib/ gtkopengl.pas"/>
293287</CONFIG>
294288```
295289
296290- IDE автоматически открывает все необходимые пакеты. Это означает, что он открывает все установленные пакеты, все пакеты, помеченные для установки (автоматическая установка), все пакеты с открытым редактором, все пакеты, требуемые проектом, и все пакеты, требуемые одним из других пакетов. Ненужные пакеты автоматически выгружаются, когда IDE простаивает.
297291- IDE никогда не открывает два пакета с одним и тем же именем одновременно. Когда пользователь открывает другой файл пакета с тем же именем, IDE спросит, должен ли он заменить старый.
298292- В среде IDE есть два дополнительных набора пакетов: 'installed'(«установленные») пакеты и 'auto install' пакеты («автоматической установки»). Пакеты автоматической установки будут связаны с IDE при следующей компиляции. Он создает два новых файла в каталоге config: staticpackages.inc и idemake.cfg. Затем они вызывают 'make ide OPT=@/path/to/your/config/idemake.cfg', чтобы скомпилировать самих себя.
299293
300294## Состояние пакета
301295
302296Пакет может не иметь ни одного, иметь один или несколько из следующих состояний:
303297
304298- **used** (используемый) - пакет может **использоваться** проектом или пакетом, т.е. он является обязательным и перечислен в Инспекторе проекта или Редакторе пакетов соответственно. Когда вы открываете проект или пакет, все **используемые** пакеты автоматически **загружаются** в IDE.
305299- **loaded** (загруженный) - Когда IDE открывает файл .lpk, пакет загружается. IDE знает свои настройки и файлы. Среда автоматически загружает все **используемые** пакеты проекта и свои **установленные** пакеты. Это не загружает код пакета, так как компилятор и IDE еще не поддерживают динамические пакеты.
306300- **marked for installation** (помеченный для установки) - Чтобы запустить код пакета внутри IDE, необходимо пересобрать IDE и перезапустить его. Это означает, что первым шагом будет **пометить** пакет **для установки**. Затем пересобрать IDE и, наконец, перезапустить ее.
307301- **installed** (установленный) - Скомпилированный код пакета загружается и регистрируется в текущей запущенной IDE. Если в среде IDE удалось найти файл .lpk, он будет **загружен**.
308302- **uninstall on next start** (удаляемый при следующем запуске) - Пакет является **установленным**, но не будет скомпилирован в новую среду IDE. Это означает, что когда вы пересоберете среду IDE и перезапустите ее, пакет больше не будет **установлен**. Имейте в виду, что пакет может быть косвенно запрошен \[другим\] установленным пакетом и, следовательно, будет также \[опять\] установлен.
309303
310304## Советы и подсказки
311305
312306Пожалуйста, добавляйте здесь любые советы, подсказки или ошибки.
313307
314308- Чтобы переименовать пакет, используйте 'сохранить как'.
315309- Вы можете добавить к каждой зависимости имя файла по умолчанию. Например, вы предоставляете пример проекта для вашего пакета. Когда другой программист впервые открывает ваш пример, IDE не знает, где находится файл lpk. Просто щелкните правой кнопкой мыши по зависимости в инспекторе проектов и выберите 'Store file name as default for this dependency' («Сохранить имя файла по умолчанию для этой зависимости»). Имя файла хранится относительно проекта. Вы можете сделать то же самое для зависимостей пакетов.
316310- Использование пакета: чтобы использовать все модули пакета в проекте, включите \[опцию\] **Add package unit to uses section** («Добавить модуль пакета в секцию uses») в package editor / Options / Usage. Когда пакет добавляется в проект, секция uses файла lpr расширяется основным модулем пакета. Например, если пакет реализует новый графический тип, он имеет только секцию initialization, но код проекта не использует его напрямую.
317311
318312## Добавление существующих компонентов в пакет
319313
320314Если вы хотите добавить файл, содержащий компонент, в существующий пакет, вы можете сделать следующее:
321315
322316- Откройте файл пакета
323317- Нажмите 'Add file', чтобы добавить новый элемент в пакет.
324318- Выберите вкладку модуля в диалоговом окне 'Add to package'.
325319- Выберите файл для добавления.
326320- Проверьте \[наличие\] 'Has register procedure', если модуль содержит процедуру Register. Если вы этого не сделаете, компонент(ы) не будут отображаться в палитре компонентов.
327321- Нажмите 'Add unit'.
328322- Пересоберите и установите пакет.
329323
330324Вот и все. Теперь компонент должен отображаться в палитре компонентов.
331325
332326## Создание пакета с модулем, имя которого совпадает с именем пакета
333327
334328Обычно IDE автоматически создает регистрационный код внутри модуля с тем же именем, что и пакет. Если вы хотите присвоить вашему пакету имя, совпадающее с существующим модулем, например, потому что пакет содержит только один модуль, тогда вам нужен как минимум Lazarus 0.9.29 и использование этого:
335329
336330- Сделайте резервную копию вашего модуля *mypackage.pas*.
337331- Создайте пакет *mypackage.lpk* обычным способом и пока не добавляйте модуль.
338332- Добавьте новый модуль, например, *mypackageall.pas*.
339333- Выберите модуль *mypackageall.pas* в редакторе пакетов и щелкните правой кнопкой мыши для \[вызова\] всплывающего меню.
340334- Измените *File type* на *Main Unit*.
341335- Теперь восстановите ваш модуль *mypackage.pas* и добавьте его в пакет.
342336
343337## Процедура регистрации
344338
345339Чтобы отобразить компонент на палитре компонентов, он должен быть зарегистрирован в Lazarus. Это делается в процедуре 'Register'. Это процедура, которая должна появиться в секции интерфейса модуля, в котором она находится, и должна выполнить один или несколько вызовов RegisterComponent, а также установить редакторы свойств и компонентов для компонентов.
346340
347341В пакете может присутствовать одна или несколько процедур регистрации: в редакторе пакетов необходимо указать модули, у которых есть процедура 'register', поэтому Lazarus знает, какие процедуры он должен вызывать при установке пакета.
348342
349343Есть 2 способа пометить модуль, как имеющий процедуру регистрации:
350344
351345- Вы можете сделать это при добавлении модулей в пакет (см. раздел [[Lazarus Packages/ru|Добавление существующих компонентов в пакет]]),
352346- или вы можете выбрать устройство в диалоговом окне пакета и пометить checkbox 'Register' на панели сведений.
353347
354348Не забудьте перекомпилировать и установить пакет после изменения свойств.
355349
356350## Поиск путей
357351
358352Все пути поиска хранятся относительно каталога файла .lpk. Если вы используете абсолютный путь, вы либо \[ничего\] не поняли \[про\] пакеты, либо вам все равно.
359353
360354Каждый пакет имеет два типа путей поиска:
361355
362356- Пути в *Options / Compiler Options* используются для компиляции самого пакета.
363357- Пути в [[IDE Window: Package Options/ru|Options / Package Options / Usage]] используются пакетами и проектами, которым требуется этот пакет. Другими словами, эти пути добавляются в пути поиска проекта (или требующего пакет). Имейте в виду, что если в проекте используется пакет A, а в нем используется пакет B, то параметры *Usage* \[пакета\] B добавляется \[и\] к \[пакету\] A, **и** к проекту.
364358
365359Начиная с версии 0.9.29 вы можете указывать параметры компилятора в зависимости от целевой платформы.
366360
367361## Ваш пакет предоставляет библиотеку, как расширить путь поиска компоновщика во всех ваших проектах
368362
369363Пакет может определять пути поиска, которые добавляются во \[все\] пакеты и проекты, использующие \[этот пакет\]. См. [[IDE Window: Package Options/ru|Options / Package Options / Usage]].
370364
371365## Пакеты Design Time vs пакетов Run Time
372366
373367Существует четыре разных типа пакетов.
374368
3753691. Пакет **design and runtime** \[(времени разработки и времени исполнения)\] может быть установлен в IDE и может использоваться проектами в обычном режиме. Это по умолчанию.
3763702. Пакет **design time** \[(времени разработки)\] может быть установлен в IDE и предоставляет расширения IDE, такие как новые компоненты, новые типы файлов или проектов, новые элементы меню, новые редакторы компонентов или свойств и т.д. Проекты могут использовать пакеты *design time* (т.е. они перечислены в требованиях инспектора проекта), но по умолчанию пакет времени разработки не компилируется в проект. Это означает, что модули проекта не могут использовать модули пакета *design time*. Когда проект использует такой пакет, IDE предупреждает \[об этом\] перед открытием формы проекта, поэтому пользователь может установить \[этот пакет\] в первую очередь. Чтобы протестировать пакет времени разработки вне IDE, вы можете использовать его в тестовом проекте. Для этого случая вы можете изменить \[стандартное поведение\] в \[разделе настроек проекта\] *Project Options / Miscellaneous / Use design time packages*.
3773713. Пакет **run time** \[(времени исполнения)\] может быть использован в проектах. Пользователь не может установить такой пакет напрямую (он не указан в списке). \[Пакет времени исполнения\] не может зарегистрировать сущности в IDE. Он может использоваться пакетами *design time*, поэтому он может быть установлен косвенно.
3783724. Пакет **run time only** \[(только времени исполнения)\] может использоваться только проектами. Он не может быть установлен в IDE, даже косвенно. Например, если пакет несовместим с основными пакетами IDE, такими как LCL. \[Тип доступен, начиная с версии\] 0.9.31.
379373
380374### Типичный сценарий для запуска пакета time и design time package
381375
382376У вас есть библиотека компонентов с именем *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*.
383377
384378### Для Дельфийцев: я не могу установить runtime пакет, с чего бы?
385379
386380**Установка пакета** означает сборку всего кода в IDE. Пакет **run time** не содержит код для IDE или, возможно, даже кусает его. Чтобы использовать пакет в вашем проекте, просто откройте пакет, щелкните правой кнопкой мыши на редакторе пакетов для \[вызова\] всплывающего меню и нажмите **Add to project**. В качестве альтернативы вы можете использовать *View / Project Inspector*. Инспектор проектов показывает, какие пакеты используются вашим проектом, вы можете добавить зависимости или удалить их.
387381
388382### Примеры
389383
390384Пример для расширения Usage / Units path.
391385
392386Платформа [tiOPF](http://tiopf.sourceforge.net/index.shtml) имеет следующую структуру каталогов, поскольку она компилируется для FPC, Delphi 5-7, D2005 и D2006:
393387
394388 Source <= полный путь \Programming\3rdParty\tiOPF\Source
395389 \Compilers
396390 \Delphi7 <= Delphi 7 файлы пакета находятся здесь
397391 \D2005
398392 \FPC <= tiOPF.lpk находится здесь
399393 \Core <= файлы модуля ядра
400394 \Options <= дополнительный файл модуля для специальных функций
401395 \GUI
402396
403397В этом примере в поле редактирования "Options - Usage - Units" включены следующие пути:
404398
405399`"$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI" `
406400
407401Этот путь поиска будет добавлен в любой проект, использующий этот пакет. По умолчанию используется \[макрос\] \$(PkgOutDir), который добавляет в проект только файлы ppu. Добавление дополнительных путей поиска приводит к тому, что исходные файлы .pas обнаруживаются компилятором второй раз - один раз при компиляции пакета и один раз при компиляции вашего проекта. Поскольку пакет и проект используют разные настройки, компилятор может создать вторую версию ppu, которая будет помещена в выходной каталог вашего проекта. Тогда у вас будет два процессора для одного устройства, а затем вы можете получить странные ошибки. Чтобы избежать дублирования, отключите компиляцию пакета, установив его для компиляции только вручную.
408402
409403## Платформозависимые модули
410404
411405Существуют различные способы разделения платформозависимого кода:
412406
413407### Одна модуль на платформу, несколько модулей с одинаковым именем
414408
415409Например, модуль *myconnect.pas* имеет две версии: одну для Windows и одну для Unix/Linux/OSX/BSD. Идея состоит в том, чтобы поместить модули в разные подкаталоги и использовать макросы в путях поиска.
416410
417411- Создайте два подкаталога: **win** и **unix**.
418412- Добавьте в инспекторе пакета в Options / Compiler options / Paths / Other пути к файлам модулей **\$(SrcOS)**. SrcOS - это [[IDE Macros in paths and filenames/ru|макрос]], который переносит \[пути поиска в папку\] *win* под Windows и \[в папку\] *unix* под Linux/OSX/BSD.
419413- Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под \[именем\] **win/myconnect.pas**.
420414- Если модуль не выбран в редакторе пакетов, выберите его.
421415- Отключите **use unit**.
422416- Создайте второй модуль нового пакета (package / Add / New file / Pascal unit) и сохраните под \[именем\] **unix/myconnect.pas**.
423417- Оставьте **use unit** включенным. Он будет использоваться один раз.
424418
425419### Один модуль только для одной платформы / условный модуль
426420
427421Например: модуль *mywin.pas* должен использоваться только под Windows, т.е. он должен использоваться и компилироваться, только если определен флаг **Windows**.
428422
429423Идея состоит в том, чтобы использовать модуль косвенно, используя \[директиву условной компиляции\] IFDEF. В следующем примере показано, как модуль **mywin.pas** используется и компилируется только тогда, когда определен флаг **Windows**.
430424
431425- Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под \[именем\] **mywin.pas**.
432426- Если модуль не выбран в редакторе пакета, выберите его.
433427- Отключите **use unit**.
434428- Создайте модуль нового пакета (package / Add / New file / Pascal unit) и сохраните его под \[именем\] **mypkgcompile.pas**.
435429- Добавьте в секцию \[модуля\] **mypkgcompile.pas**:
436430
437431``` pascal
438432uses
439433 Classes
440434 {$IFDEF Windows}
441435 ,mywin
442436 {$ENDIF}
443437 ;
444438```
445439
446440> **Note:** \[Модуль\] mypkgcompile будет компилироваться на всех платформах. \[Модуль\] mywin будет компилироваться только под Windows. Вам не нужно использовать модуль mypkgcompile в вашем проекте.
447441
448442## Различные версии пакета
449443
450444Если вы работаете с разными версиями пакета, вы можете в любой момент открыть другой файл пакета. Старый пакет будет закрыт, а новый будет открыт. Зарегистрированные компоненты будут перенесены в новый пакет. Например, палитра компонентов по-прежнему будет показывать компоненты старого пакета, с которым была собрана среда IDE. Но по щелчку ПКМ по компоненту будут показаны пункты меню открытого в прошлый раз пакета.
451445
452446Вы можете указать минимальную, максимальную требуемую версию. Когда проект открыт и в нем есть несколько файлов .lpk, IDE автоматически откроет файл с нужной версией.
453447
454448Если вы работаете с разными проектами, для которых требуются разные версии пакета (например, с разными ветками одного и того же пакета), вы можете определить предпочтительный вариант в зависимостях. В инспекторе проекта щелкните правой кнопкой мыши по зависимости и выберите *Set file name as preferred for this dependency* \[(«Установить имя файла как предпочтительное для этой зависимости»)\]. При открытии проекта будет открыт и предпочтительный пакет. Если пакет с таким именем уже существует, он будет заменен. Эта функция существует с \[версии\] 0.9.29.\
455449![](/wiki-images/c/c8/SetDefaultPkDependency1.png)
456450
457451См. также [[IDE Window: Project Inspector/ru|Сохранить как имя файла по умолчанию для этой зависимости]]
458452
459453### Пример библиотеки с несколькими lpk
460454
461455Библиотека содержит два файла lpk: *main.lpk* и *sub.lpk*. *main* зависит от *sub*. Библиотека имеет две версии *1.0* и *2.0*.
462456
463457 trunk/
464458 main.lpk version 2.0, requires sub
465459 sub.lpk version 2.0
466460 fixes/
467461 main.lpk version 1.0, requires sub
468462 sub.lpk version 1.0
469463
470464Когда вы открываете *main.lpk 1.0* в первый раз, IDE ищет пакет *sub* в своей базе данных, а затем ищет *sub.lpk* в текущей папке. Она находит *sub.lpk 1.0* и загружает его.
471465
472466Когда вы открываете *main.lpk 2.0*, IDE уже знает *sub.lpk* версии 1.0 и загружает его. Она не загрузит *sub.lpk 2.0*.
473467
474468Есть два решения:
475469
476470#### Использование минимальной, максимальной версии
477471
478472Вы можете установить для каждой зависимости минимальную и максимальную версию. Когда вы устанавливаете минимальную и максимальную версию зависимости, происходит следующее: *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*.
479473
480474#### Использование предпочтительного имени файла
481475
482476Если два файла lpk всегда распространяются вместе, вы можете использовать вместо минимальной и максимальной версий опцию **preferred** \[("предпочтительный")\]. Откройте *main.lpk* и *sub.lpk* из транка, чтобы убедиться, что загружены правильные версии. Затем щелкните правой кнопкой мыши на зависимости *sub* от *main* и выберите *preferred file name* \[("предпочтительное имя файла")\]. Имя файла появится справа от зависимости. Повторите этот шаг с файлами lpk из версии *2.0*. Теперь в среде IDE всегда будет открываться правильный *sub.lpk*.
483477
484478## Режимы сборки
485479
486480Вы можете добавить режимы сборки в свой пакет. Смотрите здесь различные способы достижения этого:
487481
488482[[Macros and Conditionals|Build modes for packages]]
489483
490484## Компиляция пакета через make
491485
492486В среде IDE можно создать простой **Makefile** для пакета с помощью *Package editor / More ... / Create Makefile*. Среда IDE создает файл **Makefile.fpc** и вызывает **fpcmake**, который создает Makefile. Начиная с \[версии\] 0.9.29 в среде IDE также создается файл **Makefile.compiled**. Если вы используете систему контроля версий, такую как svn или git, добавьте все три файла в репозиторий:
493487
494488`Makefile`\
495489`Makefile.fpc`\
496490`Makefile.compiled`
497491
498492Теперь вы можете запустить **make** (например, откройте консоль, перейдите в каталог пакета с Makefile), чтобы скомпилировать пакет. Это скомпилирует пакет и после успешной компиляции скопирует Makefile.compiled в выходной каталог модуля.
499493
500494**Заметки:**
501495
502496- Makefile использует фиксированные пути, поэтому он **не** будет автоматически адаптироваться к изменениям, как \[это делают\] IDE или lazbuild.
503497- IDE может воссоздавать Makefile при каждой компиляции. \[Для этого\] включите параметр *Package editor / Options / Compiler Options / Compilation / Create Makefile*.
504498- Makefile не содержит логики для условных выражений и макросов сборки, он содержит настройки на момент создания.
505499- Макросы \$(TargetOS), \$(TargetCPU) и \$(LCLWidgetType) заменяются на %TargetOS%, %TargetCPU% и %LCLPlatform%. Makefile имеет некую логику для установки некоторых значений по умолчанию. Вы можете переопределить их (например, make LCLPlatform=qt).
506500- Файл Makefile.compiled копируется \[файлом\] Makefile после успешной компиляции в \<PkgOutDir\>/\<PkgName\>.compiled и проверяется IDE (и lazbuild), если пакет требует перекомпиляции. Например, двоичные файлы Lazarus (установщик Windows, пакеты deb и rpm, пакет OS X dmg) компилируются с помощью **make**, и когда IDE запускается и компилирует программу, она не будет пересобирать используемые пакеты, если пользователь не установит некоторые дополнительные флаги. Например, когда пользователь изменяет *IDEBuildOptions* через *Configure Build Lazarus dialog*, IDE обнаружит разницу и пересоберет пакет при следующей компиляции.
507501- Если вы забудете добавить Makefile.compiled в svn, вы получите сообщение об ошибке: /bin/cp: cannot stat \`Makefile.compiled': No such file or directory \[("/bin/cp: невозможно указать \`Makefile.compiled ': Нет такого файла или каталога")\].
508502
509503## Создание закрытого пакета
510504
511505Цель: вы хотите опубликовать пакет, но хотите сохранить исходный код закрытым.
512506
513507На данный момент многие функции IDE требуют исходный код; среда IDE предупреждает, если исходный код модуля отсутствует. Поэтому вы должны опубликовать части интерфейса модулей и файлы, которые создает компилятор (файлы *.ppu и *.o).
514508
515509Этапы:
516510
517511- Создайте копию папки пакета и измените эту копию следующим образом.
518512- В инспекторе пакета в Package editor / Options / IDE integration установите **Update / Rebuild** в **Manual compilation**.
519513- Скомпилируйте его один раз.
520514- Удалите секции implementation всех модулей (т.е. все после ключевого слова `implementation` каждого модуля, включая `initialization` и `finalization`, сохраняя только "`end.`"). Вы также можете удалить секцию `private`.
521515- Необязательно: Вы можете использовать инструмент распространения пакета (Package Editor / More ... / Publish Package), чтобы создать zip-пакет.
522516- Вы можете удалить .compiled файл, Makefile, файлы rst, файлы lrt. Все остальные файлы в выходном каталоге, такие как .ppu, .o, .lfm, нужны для компилятора. Для среды IDE требуются файлы .lpk, а также файлы .pas и .inc.
523517
524518Существует утилита командной строки **sourcecloser**, которая изменяет lpk и удаляет разделы реализации. Вы можете найти ее в *lazarus/components/codetools/examples/sourcecloser.lpi*.
525519
526520См. также:
527521
528522- эта статья о FPC с закрытым исходным кодом: [[Releasing units without source code/ru|Releasing units without source code]]
529523- Prezi: <http://prezi.com/vpuyxca-qboq/how-to-create-a-closed-source-package-with-lazarus/>
530524
531525## Параллельная компиляция
532526
533527IDE и lazbuild компилируют пакеты параллельно (начиная с версии 1.3). Каждый пакет по-прежнему компилируется одним вызовом fpc (однопоточным).
534528
535529Вы можете установить максимальное количество параллельных процессов в *Tools / Options / Messages Window*. По умолчанию среда пытается угадать количество ядер процессора с помощью функции *GetSystemThreadCount* в модуле *UTF8Process*.
536530
537531## См.также
538532
539533- [[How To Write Lazarus Component/ru|How To Write Lazarus Component]] - учебник по созданию нового компонента.
540534- [[Install IDE packages without the IDE]]
541535- [Создание визуальных компонент для Lazarus](http://freepascal.ru/article/lazarus/20050530152619/) - статья Сергея Смирнова на русскоязычном ресурсе
542536
543537---
544538*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](/wiki-contact).*

Back to history