Sign in Join
Wiki copytemporary

Debian package structure/ru: what changed

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

OldNewLine
11Установки в Debian выполняются файлами с расширением .deb. В этой статье рассматривается, как создать их вручную.
22
33Если вы хотите разместить свою программу в дистрибутивы Debian, см. раздел как создать исходный код для [[Debian upstream]].
44
55## Основной раздел
66
77### Два типа пакетов
88
99Существует два типа пакетов: пакеты исходных кодов и бинарный пакет. В этой статье будет вестись речь о бинарных пакетах. Бинарные пакеты представляют удобный способ консолидации предварительно скомпилированных бинарных файлов, готовых для предоставлению непосредственно конечному пользователю. Однако дистрибутивы наподобии Debian или Ubuntu не смогут принять бинарные пакеты в свои репозитарии, они требуют Debian-пакеты исходных кодов ([[Debian package source|source package]]), которые могут использоваться для сборки бинарных версий в случае необходимости. Пакеты исходных кодов Debian ([[Debian package source|source package]]) несколько сложнее собрать и подчиняется ряду технических и юридических правил, прежде чем могут быть приняты в большинстве дистрибутивов Linux.
1010
1111### Подготовка пакетов
1212
1313В бинарном пакете Debian файлы установки сжимаются с использованием команды **dpkg-deb**. Вы можете увидеть содержимое сформированных .deb файлов также как и любых других упакованных архивов, нажав правую кнопку мыши на них и открывая их в менеджере архивов (т.е. в обычном архиваторе).
1414
1515Чтобы сделать .deb файл, Вам следует подготовить структуру папок с соответствующими файлами. Это будет называться промежуточной папкой и выражено в этой статье переменной `${STAGING_DIR}`. Вы можете заменить его подходящей папкой или определить эту переменную в скрипте.
1616
1717Вы можете для примера создать эту промежуточную папку как поддиректорию текущей папки. Простейший скрипт будет таким:
1818
19-`STAGING_DIR=./staging`\
20-`mkdir ${STAGING_DIR}`
19+```text
20+STAGING_DIR=./staging
21+mkdir ${STAGING_DIR}
22+```
2123
2224Однако, если Вы напишите скрипт, то он может запускаться из другой папки. Поэтому вместо этого Вы можете убедиться в том, что эта переменная содержит подпапку относительно скрипта с помощью нижеследующим кодом:
2325
24-`` cd `dirname $0` ``\
25-`STAGING_RELATIVEDIR="./staging"`\
26-`STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")`
26+```text
27+cd `dirname $0`
28+STAGING_RELATIVEDIR="./staging"
29+STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")
30+```
2731
2832Также вам может потребоваться удалить существующий промежуточный каталог, чтобы убедиться, что он пуст:
2933
30-`rm -rf "${STAGING_DIR}"`\
31-`mkdir "${STAGING_DIR}"`
34+```text
35+rm -rf "${STAGING_DIR}"
36+mkdir "${STAGING_DIR}"
37+```
3238
3339Содержимое этой папки раскрывается далее в этой статье
3440
3541### Промежуточная папка. Завершение
3642
3743Прочитайте раздел *Структура папок*, чтобы добавить необходимые файлы. После чего Вы можете завершить работу с этой папкой.
3844
3945Папки и файлы в этом архиве предполагаются только для чтения (ReadOnly). Чтобы убедиться в этом Вы можете перед вызовом **dpkg-deb** сделать нижеследующее:
4046
41-`find "${STAGING_DIR}" -type d -exec chmod 0755 {} \;  #установить атрибуты папок`\
42-`find "${STAGING_DIR}" -type f -exec chmod 0644 {} \;  #установить атрибуты файлов`\
43-`find "${STAGING_DIR}/usr/bin" -type f -exec chmod 0755 {} \;  #установить атрибуты для исполняемых файлов`
47+``` pascal
48+find "${STAGING_DIR}" -type d -exec chmod 0755 {} \; #установить атрибуты папок
49+find "${STAGING_DIR}" -type f -exec chmod 0644 {} \; #установить атрибуты файлов
50+find "${STAGING_DIR}/usr/bin" -type f -exec chmod 0755 {} \; #установить атрибуты для исполняемых файлов
51+```
4452
4553Когда у Вас будут собраны все нужные файлы в промежуточной папке, Вы можете определить установочный размер и добавить его в файл **control**:
4654
47-`SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"`\
48-`echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"`
55+```text
56+SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"
57+echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"
58+```
4959
5060### Создание Deb архива
5161
5262Как только структура папок будет готова Вы можете создать архив с помощью:
5363
54-`dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
64+```text
65+dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"
66+```
5567
5668Или для более старых версий dpkg-deb:
5769
58-`fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
70+```text
71+fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"
72+```
5973
6074`${STAGING_DIR}` это путь к структуре папок для сжатия. `${PACKAGE_NAME}` это имя файла, которое будет использоваться для архива.
6175
6276Как правило Вы создаете архив под обычным пользователем, а не с *root* аккаунта. Но установочные файлы должны принадлежать определенному пользователю. Используя флаг `--root-owner-group` или префикс **fakeroot** Вы сохраните в архиве информацию о принадлежности файлов *root* пользователю.
6377
6478После этого вам, вероятно, больше не понадобится промежуточная папка, поэтому вы можете удалить его:
6579
66-`rm -rf "${STAGING_DIR}"`
80+```text
81+rm -rf "${STAGING_DIR}"
82+```
6783
6884### Проверка архива
6985
7086После того, как вы создали пакет, вы можете проверить, что он соответствует рекомендациям с помощью команды **lintian**:
7187
72-`lintian "${PACKAGE_NAME}.deb" --info`
88+```text
89+lintian "${PACKAGE_NAME}.deb" --info
90+```
7391
7492Здесь приведен список возможных проблем: <https://lintian.debian.org/tags.html>
7593
7694В Lazarus Вы по умолчанию получите предупреждения `hardening-no-pie` (и `hardening-no-windnow`). Чтобы избежать такие предупреждений добавьте следующие параметры компилятора в параметры проекта:
7795
78-`-Cg`\
79-`-k-pie`\
80-`-k-znow`
96+```text
97+-Cg
98+-k-pie
99+-k-znow
100+```
81101
82102## Структура папок
83103
84104Ниже приведена структура промежуточного каталога, который вам необходимо подготовить.
85105
86-`staging (промежуточный каталог)`\
87-`  ├─ DEBIAN`\
88-`  └─ usr`\
89-`      ├─ bin`\
90-`      └─ share`\
91-`          ├─ project1       #ресурсы для Вашего пакета`\
92-`          ├─ applications   #ярлыки`\
93-`          ├─ pixmaps        #значок по умолчанию`\
94-`          ├─ icons`\
95-`          │   └─ hicolor    #значки различных размеров`\
96-`          ├─ doc`\
97-`          │   └─ project1   #информация о Вашем пакете`\
98-`          └─ man            #руководство пользователя`\
99-`              └─ man1       #оглавление`
106+```text
107+staging (промежуточный каталог)
108+ ├─ DEBIAN
109+ └─ usr
110+ ├─ bin
111+ └─ share
112+ ├─ project1 #ресурсы для Вашего пакета
113+ ├─ applications #ярлыки
114+ ├─ pixmaps #значок по умолчанию
115+ ├─ icons
116+ │ └─ hicolor #значки различных размеров
117+ ├─ doc
118+ │ └─ project1 #информация о Вашем пакете
119+ └─ man #руководство пользователя
120+ └─ man1 #оглавление
121+```
100122
101123### Папка DEBIAN
102124
103125Имя этого каталога указано в верхнем регистре. Он должен содержать один файл под названием **control**. Ниже пример пакета под названием **project1** в версии 2.0.
104126
105-`Section: graphics`\
106-`Priority: optional`\
107-`Maintainer: myname <myname@webserver.com>`\
108-`Homepage: `[`https://www.project1.com`](https://www.project1.com)\
109-`Package: project1`\
110-`Architecture: amd64`\
111-`Version: 2.0`\
112-`Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6`\
113-`Description: Это тестовый проект.`\
114-` Длинное описание бла-бла-бла.`
127+```text
128+Section: graphics
129+Priority: optional
130+Maintainer: myname <myname@webserver.com>
131+Homepage: https://www.project1.com
132+Package: project1
133+Architecture: amd64
134+Version: 2.0
135+Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6
136+Description: Это тестовый проект.
137+ Длинное описание бла-бла-бла.
138+```
115139
116140Примеры значений для поля **Section**: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.
117141
118142Поле **Architecture** используется для компиляции программы. Чтобы узнать текущую архитектуру, используйте следующую команду:
119143
120-`dpkg --print-architecture`
144+```text
145+dpkg --print-architecture
146+```
121147
122148Поле **Depends** содержит список используемых Linux библиотек. Вы можете получить этот список с помощью следующих команд, выполняемых в папке вашего бинарного файла:
123149
124-`mkdir debian                 #требуется папка debian`\
125-`touch debian/control         #с одним файлом control в нем`\
126-`dpkg-shlibdeps -O project1   #предполагается, что ваш бинарный файл называется project1`
150+```text
151+mkdir debian #требуется папка debian
152+touch debian/control #с одним файлом control в нем
153+dpkg-shlibdeps -O project1 #предполагается, что ваш бинарный файл называется project1
154+```
127155
128156Затем вы можете удалить почти пустую папку *debian*, если вы ее не используете.
129157
130158Все это выведет зависимости (после знака равенства):
131159
132-`shlibs:Depends=libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6`
160+```text
161+shlibs:Depends=libatk1.0-0 (>= 1.12.4), libc6 (>= 2.2.5), libcairo2 (>= 1.2.4), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.12.0), libgtk2.0-0 (>= 2.24.0), libpango-1.0-0 (>= 1.18.0), libx11-6
162+```
133163
134164Для полноты следует отметить, что все эти пакеты не являются абсолютно необходимыми, поскольку несколько пакетов в этом списке уже могут быть частью зависимостей - и, следовательно, частью установки - другого пакета, указанного в этом же списке (см. [1](https://wiki.freepascal.org/Deploying_Your_Application#Tip%3A) для перекрестной проверки и устранения лишних зависимостей).
135165
136166### Папка usr/bin
137167
138168Эта папка содержит бинарный файл и только его (*для информации: избегайте символа подчеркивания в имени Вашего проекта - для примера, dpkg-deb избегает этого - потому что имя пакета должно удовлетворять регулярному выражению: \${PackageName}_\${Version}_\${Arch}.deb, e.g. dpkg-dev_1.19.0.5ubuntu2_all.deb*). Все ресурсные файлы должны быть помещены в *usr/share/project1*. Для доступа к ресурсам Ваша программа может использовать относительный путь наподобии *../share/project1*.
139169
140170Папка *usr/local/bin* недопустима в пакете [2](https://lintian.debian.org/tags/file-in-usr-local.html) потому что *local* используется проектами, компилируемыми локально и установленные с помощью их Makefile.
141171
142172### Папка ресурсов
143173
144174Она будет называться *usr/share/project1*, если имя пакета "project1".\
145175Вы можете разместить там все файлы данных, нужные Вашей программе. Обращаем внимание, что они будут "только для чтения".
146176
147177### Папка конфигурации
148178
149179Существуют разные места для размещения [[Multiplatform Programming Guide/ru|конфигурационных файлов]]. Конфигурационные файлы (или файлы настроек) должны быть изначально созданы самим приложением (значениями по умолчанию), если их не существует в момент старта приложения.
150180
151181### Папка usr/share/applications
152182
153183Чтобы добавить Ваше приложение в меню Linux, Вы должны добавить файл **project1.desktop**, содержащий:
154184
155-`[Desktop Entry]`\
156-`Name=Project1`\
157-`Comment=Cool project`\
158-`Icon=project1`\
159-`Exec=project1`\
160-`Terminal=false`\
161-`Type=Application`\
162-`Categories=Graphics`\
163-`GenericName=Project1`\
164-`Keywords=feature1; feature2; feature3`
185+``` pascal
186+[Desktop Entry]
187+Name=Project1
188+Comment=Cool project
189+Icon=project1
190+Exec=project1
191+Terminal=false
192+Type=Application
193+Categories=Graphics
194+GenericName=Project1
195+Keywords=feature1; feature2; feature3
196+```
165197
166198Этот файл напоминает "ярлык" для Вашей программы.
167199
168200Поле **Categories** как такое же в файле **control**. Это может быть для примера: Communication, Database, Development, Editors, Electronics, Fonts, Games, Graphics, Math, Internet, Networking, News, Science, Sound, Utility, Video.
169201
170202Поле keywords помогает в поиске в приложениях.
171203
172204Обратите внимание, что вам необходимо предоставить значок в виде файла PNG либо в каталоге *usr/share/pixmaps* либо в *usr/share/icons/hicolor*.
173205
174206#### Папка usr/share/pixmaps
175207
176208Будет содержать значок одного размера для ярлыка вашего меню в формате PNG под названием **project1.png**. Среднего размера, такого как 48x48, будет вполне достаточно.
177209
178210#### Папка usr/share/icons/hicolor
179211
180212Будет содержать значок нескольких размеров. Вот структура каталогов:
181213
182-`icons`\
183-` └─ hicolor`\
184-`     ├─ 8x8`\
185-`     │   └─ apps`\
186-`     ├─ 16x16`\
187-`     │   └─ apps`\
188-`     ...`
214+```text
215+icons
216+ └─ hicolor
217+ ├─ 8x8
218+ │ └─ apps
219+ ├─ 16x16
220+ │ └─ apps
221+ ...
222+```
189223
190224Существует подкаталог для каждого возможного размера. Вы можете отобразить все размеры, определенные в настоящее время в вашей системе, написав:
191225
192-`ls /usr/share/icons/hicolor`
226+```text
227+ls /usr/share/icons/hicolor
228+```
193229
194230В каждую папку приложений поместите изображение со всегда одним и тем же именем. Если ваш проект называется project1, то для большинства папок он будет называться "project1.png". В масштабируемые и символические папки вы можете поместить SVG-файл.
195231
196232### Папка документации
197233
198234Она будет называться *usr/share/doc/project1*, если имя пакета будет "project1".
199235
200236Папка содержит файлы **changelog.Debian.gz** и **copyright** и (необязательно) файл **README**.
201237
202238#### Файл журнала изменений
203239
204240Минимальный файл журнала изменений (changelog):
205241
206-`project1 (1.0) unstable; urgency=low`\
242+```text
243+project1 (1.0) unstable; urgency=low
207244
208-`  * Первый релиз`\
245+ * Первый релиз
209246
210-` -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100`
247+ -- myname <myname@webserver.com> Tue, 19 May 2020 11:06:00 +0100
248+```
211249
212250Вы можете добавить множество строк, начинающихся с *, чтобы указать список изменений в версии. Пробелы в начале строки необходимы. Только строка, указывающая версию, начинается непосредственно в начале строки.
213251
214252Последняя версия должна быть в верхней части файла.
215253
216254Список изменений должен быть сжат с максимальной степенью. Для этого, предполагая что у вас уже есть несжатый файл **changelog**, сожмите его с помощью следующей команды:
217255
218-`gzip -9 -n usr/share/doc/project1/changelog.Debian`
256+```text
257+gzip -9 -n usr/share/doc/project1/changelog.Debian
258+```
219259
220260Флаги -9 -n необходимы, чтобы пакета соответствовал инструкциям.
221261
222262#### Файл copyright
223263
224264Если вы предоставляете пакет Deb самостоятельно, необязательно использовать машиночитаемый формат, однако это подготовит вас к публикации пакета в дистрибутивах Debian. См.: [[Debian package source|copyright in Debian package structure]].
225265
226266### Папка usr/share/man
227267
228268Содержит руководство пользователя, которое вы можете просмотреть с помощью команды **man**. Он должен содержать по крайней мере **project1.1.gz** в подкаталоге *man1*, который будет индексной страницей вашего руководства.
229269
230270Синтаксис немного своеобразен. Есть некоторые инструменты, которые могут помочь, но вам все равно нужно знать синтаксис.
231271
232272- описание синтаксиса: <https://liw.fi/manpages/>
233273- редактор с мастером и режимом предварительного просмотра WYSIWYG: **gmanedit**
234274- онлайн редактор с предварительным просмотром (переключитесь в режим AN): <https://roperzh.github.io/grapse/>
235275
236276Вот пример файла:
237277
238-`.TH Project1 1 "19 May 2020" "" Project1`\
239-`.SH NAME`\
240-`Project1 - My cool project`\
241-`.SH SYNOPSIS`\
242-`.B project1`\
243-`[PARAMETER]`\
244-`.SH DESCRIPTION`\
245-`What my program does.`\
246-`.PP`\
247-`More description.`
278+``` pascal
279+.TH Project1 1 "19 May 2020" "" Project1
280+.SH NAME
281+Project1 - My cool project
282+.SH SYNOPSIS
283+.B project1
284+[PARAMETER]
285+.SH DESCRIPTION
286+What my program does.
287+.PP
288+More description.
289+```
248290
249291Это руководство как и файл журнала изменений, должен быть сжат командой:
250292
251-`gzip -9 -n usr/share/man/man1/project1.1`
293+```text
294+gzip -9 -n usr/share/man/man1/project1.1
295+```
252296
253297Флаги -9 -n необходимы, чтобы пакет соответствовал инструкциям.
254298
255299---
256300*From the Free Pascal wiki, page "Debian package structure/ru", as it stood on 2022-01-02 after a change by FTurtle, 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