Sign in Join
Wiki copytemporary

Debian package structure/ru: what changed

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

Title: Debian package structure/ru

OldNewLine
1+Установки в Debian выполняются файлами с расширением .deb. В этой статье рассматривается, как создать их вручную.
2+
3+Если вы хотите разместить свою программу в дистрибутивы Debian, см. раздел как создать исходный код для [[Debian upstream]].
4+
5+## Основной раздел
6+
7+### Два типа пакетов
8+
9+Существует два типа пакетов: пакеты исходных кодов и бинарный пакет. В этой статье будет вестись речь о бинарных пакетах. Бинарные пакеты представляют удобный способ консолидации предварительно скомпилированных бинарных файлов, готовых для предоставлению непосредственно конечному пользователю. Однако дистрибутивы наподобии Debian или Ubuntu не смогут принять бинарные пакеты в свои репозитарии, они требуют Debian-пакеты исходных кодов ([[Debian package source|source package]]), которые могут использоваться для сборки бинарных версий в случае необходимости. Пакеты исходных кодов Debian ([[Debian package source|source package]]) несколько сложнее собрать и подчиняется ряду технических и юридических правил, прежде чем могут быть приняты в большинстве дистрибутивов Linux.
10+
11+### Подготовка пакетов
12+
13+В бинарном пакете Debian файлы установки сжимаются с использованием команды **dpkg-deb**. Вы можете увидеть содержимое сформированных .deb файлов также как и любых других упакованных архивов, нажав правую кнопку мыши на них и открывая их в менеджере архивов (т.е. в обычном архиваторе).
14+
15+Чтобы сделать .deb файл, Вам следует подготовить структуру папок с соответствующими файлами. Это будет называться промежуточной папкой и выражено в этой статье переменной `${STAGING_DIR}`. Вы можете заменить его подходящей папкой или определить эту переменную в скрипте.
16+
17+Вы можете для примера создать эту промежуточную папку как поддиректорию текущей папки. Простейший скрипт будет таким:
18+
19+`STAGING_DIR=./staging`\
20+`mkdir ${STAGING_DIR}`
21+
22+Однако, если Вы напишите скрипт, то он может запускаться из другой папки. Поэтому вместо этого Вы можете убедиться в том, что эта переменная содержит подпапку относительно скрипта с помощью нижеследующим кодом:
23+
24+`` cd `dirname $0` ``\
25+`STAGING_RELATIVEDIR="./staging"`\
26+`STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")`
27+
28+Также вам может потребоваться удалить существующий промежуточный каталог, чтобы убедиться, что он пуст:
29+
30+`rm -rf "${STAGING_DIR}"`\
31+`mkdir "${STAGING_DIR}"`
32+
33+Содержимое этой папки раскрывается далее в этой статье
34+
35+### Промежуточная папка. Завершение
36+
37+Прочитайте раздел *Структура папок*, чтобы добавить необходимые файлы. После чего Вы можете завершить работу с этой папкой.
38+
39+Папки и файлы в этом архиве предполагаются только для чтения (ReadOnly). Чтобы убедиться в этом Вы можете перед вызовом **dpkg-deb** сделать нижеследующее:
40+
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 {} \;  #установить атрибуты для исполняемых файлов`
44+
45+Когда у Вас будут собраны все нужные файлы в промежуточной папке, Вы можете определить установочный размер и добавить его в файл **control**:
46+
47+`SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"`\
48+`echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"`
49+
50+### Создание Deb архива
51+
52+Как только структура папок будет готова Вы можете создать архив с помощью:
53+
54+`dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
55+
56+Или для более старых версий dpkg-deb:
57+
58+`fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
59+
60+`${STAGING_DIR}` это путь к структуре папок для сжатия. `${PACKAGE_NAME}` это имя файла, которое будет использоваться для архива.
61+
62+Как правило Вы создаете архив под обычным пользователем, а не с *root* аккаунта. Но установочные файлы должны принадлежать определенному пользователю. Используя флаг `--root-owner-group` или префикс **fakeroot** Вы сохраните в архиве информацию о принадлежности файлов *root* пользователю.
63+
64+После этого вам, вероятно, больше не понадобится промежуточная папка, поэтому вы можете удалить его:
65+
66+`rm -rf "${STAGING_DIR}"`
67+
68+### Проверка архива
69+
70+После того, как вы создали пакет, вы можете проверить, что он соответствует рекомендациям с помощью команды **lintian**:
71+
72+`lintian "${PACKAGE_NAME}.deb" --info`
73+
74+Здесь приведен список возможных проблем: <https://lintian.debian.org/tags.html>
75+
76+В Lazarus Вы по умолчанию получите предупреждения `hardening-no-pie` (и `hardening-no-windnow`). Чтобы избежать такие предупреждений добавьте следующие параметры компилятора в параметры проекта:
77+
78+`-Cg`\
79+`-k-pie`\
80+`-k-znow`
81+
82+## Структура папок
83+
84+Ниже приведена структура промежуточного каталога, который вам необходимо подготовить.
85+
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       #оглавление`
100+
101+### Папка DEBIAN
102+
103+Имя этого каталога указано в верхнем регистре. Он должен содержать один файл под названием **control**. Ниже пример пакета под названием **project1** в версии 2.0.
104+
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+` Длинное описание бла-бла-бла.`
115+
116+Примеры значений для поля **Section**: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.
117+
118+Поле **Architecture** используется для компиляции программы. Чтобы узнать текущую архитектуру, используйте следующую команду:
119+
120+`dpkg --print-architecture`
121+
122+Поле **Depends** содержит список используемых Linux библиотек. Вы можете получить этот список с помощью следующих команд, выполняемых в папке вашего бинарного файла:
123+
124+`mkdir debian                 #требуется папка debian`\
125+`touch debian/control         #с одним файлом control в нем`\
126+`dpkg-shlibdeps -O project1   #предполагается, что ваш бинарный файл называется project1`
127+
128+Затем вы можете удалить почти пустую папку *debian*, если вы ее не используете.
129+
130+Все это выведет зависимости (после знака равенства):
131+
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`
133+
134+Для полноты следует отметить, что все эти пакеты не являются абсолютно необходимыми, поскольку несколько пакетов в этом списке уже могут быть частью зависимостей - и, следовательно, частью установки - другого пакета, указанного в этом же списке (см. [1](https://wiki.freepascal.org/Deploying_Your_Application#Tip%3A) для перекрестной проверки и устранения лишних зависимостей).
135+
136+### Папка usr/bin
137+
138+Эта папка содержит бинарный файл и только его (*для информации: избегайте символа подчеркивания в имени Вашего проекта - для примера, dpkg-deb избегает этого - потому что имя пакета должно удовлетворять регулярному выражению: \${PackageName}_\${Version}_\${Arch}.deb, e.g. dpkg-dev_1.19.0.5ubuntu2_all.deb*). Все ресурсные файлы должны быть помещены в *usr/share/project1*. Для доступа к ресурсам Ваша программа может использовать относительный путь наподобии *../share/project1*.
139+
140+Папка *usr/local/bin* недопустима в пакете [2](https://lintian.debian.org/tags/file-in-usr-local.html) потому что *local* используется проектами, компилируемыми локально и установленные с помощью их Makefile.
141+
142+### Папка ресурсов
143+
144+Она будет называться *usr/share/project1*, если имя пакета "project1".\
145+Вы можете разместить там все файлы данных, нужные Вашей программе. Обращаем внимание, что они будут "только для чтения".
146+
147+### Папка конфигурации
148+
149+Существуют разные места для размещения [[Multiplatform Programming Guide/ru|конфигурационных файлов]]. Конфигурационные файлы (или файлы настроек) должны быть изначально созданы самим приложением (значениями по умолчанию), если их не существует в момент старта приложения.
150+
151+### Папка usr/share/applications
152+
153+Чтобы добавить Ваше приложение в меню Linux, Вы должны добавить файл **project1.desktop**, содержащий:
154+
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`
165+
166+Этот файл напоминает "ярлык" для Вашей программы.
167+
168+Поле **Categories** как такое же в файле **control**. Это может быть для примера: Communication, Database, Development, Editors, Electronics, Fonts, Games, Graphics, Math, Internet, Networking, News, Science, Sound, Utility, Video.
169+
170+Поле keywords помогает в поиске в приложениях.
171+
172+Обратите внимание, что вам необходимо предоставить значок в виде файла PNG либо в каталоге *usr/share/pixmaps* либо в *usr/share/icons/hicolor*.
173+
174+#### Папка usr/share/pixmaps
175+
176+Будет содержать значок одного размера для ярлыка вашего меню в формате PNG под названием **project1.png**. Среднего размера, такого как 48x48, будет вполне достаточно.
177+
178+#### Папка usr/share/icons/hicolor
179+
180+Будет содержать значок нескольких размеров. Вот структура каталогов:
181+
182+`icons`\
183+` └─ hicolor`\
184+`     ├─ 8x8`\
185+`     │   └─ apps`\
186+`     ├─ 16x16`\
187+`     │   └─ apps`\
188+`     ...`
189+
190+Существует подкаталог для каждого возможного размера. Вы можете отобразить все размеры, определенные в настоящее время в вашей системе, написав:
191+
192+`ls /usr/share/icons/hicolor`
193+
194+В каждую папку приложений поместите изображение со всегда одним и тем же именем. Если ваш проект называется project1, то для большинства папок он будет называться "project1.png". В масштабируемые и символические папки вы можете поместить SVG-файл.
195+
196+### Папка документации
197+
198+Она будет называться *usr/share/doc/project1*, если имя пакета будет "project1".
199+
200+Папка содержит файлы **changelog.Debian.gz** и **copyright** и (необязательно) файл **README**.
201+
202+#### Файл журнала изменений
203+
204+Минимальный файл журнала изменений (changelog):
205+
206+`project1 (1.0) unstable; urgency=low`\
207+\
208+`  * Первый релиз`\
209+\
210+` -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100`
211+
212+Вы можете добавить множество строк, начинающихся с *, чтобы указать список изменений в версии. Пробелы в начале строки необходимы. Только строка, указывающая версию, начинается непосредственно в начале строки.
213+
214+Последняя версия должна быть в верхней части файла.
215+
216+Список изменений должен быть сжат с максимальной степенью. Для этого, предполагая что у вас уже есть несжатый файл **changelog**, сожмите его с помощью следующей команды:
217+
218+`gzip -9 -n usr/share/doc/project1/changelog.Debian`
219+
220+Флаги -9 -n необходимы, чтобы пакета соответствовал инструкциям.
221+
222+#### Файл copyright
223+
224+Если вы предоставляете пакет Deb самостоятельно, необязательно использовать машиночитаемый формат, однако это подготовит вас к публикации пакета в дистрибутивах Debian. См.: [[Debian package source|copyright in Debian package structure]].
225+
226+### Папка usr/share/man
227+
228+Содержит руководство пользователя, которое вы можете просмотреть с помощью команды **man**. Он должен содержать по крайней мере **project1.1.gz** в подкаталоге *man1*, который будет индексной страницей вашего руководства.
229+
230+Синтаксис немного своеобразен. Есть некоторые инструменты, которые могут помочь, но вам все равно нужно знать синтаксис.
231+
232+- описание синтаксиса: <https://liw.fi/manpages/>
233+- редактор с мастером и режимом предварительного просмотра WYSIWYG: **gmanedit**
234+- онлайн редактор с предварительным просмотром (переключитесь в режим AN): <https://roperzh.github.io/grapse/>
235+
236+Вот пример файла:
237+
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.`
248+
249+Это руководство как и файл журнала изменений, должен быть сжат командой:
250+
251+`gzip -9 -n usr/share/man/man1/project1.1`
252+
253+Флаги -9 -n необходимы, чтобы пакет соответствовал инструкциям.
254+
255+---
256+*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