Sign in Join
Wiki copytemporary

Debian package structure/ru: what changed

Revision 1 to 2. 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
1919`STAGING_DIR=./staging`\
2020`mkdir ${STAGING_DIR}`
2121
2222Однако, если Вы напишите скрипт, то он может запускаться из другой папки. Поэтому вместо этого Вы можете убедиться в том, что эта переменная содержит подпапку относительно скрипта с помощью нижеследующим кодом:
2323
2424`` cd `dirname $0` ``\
2525`STAGING_RELATIVEDIR="./staging"`\
2626`STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")`
2727
2828Также вам может потребоваться удалить существующий промежуточный каталог, чтобы убедиться, что он пуст:
2929
3030`rm -rf "${STAGING_DIR}"`\
3131`mkdir "${STAGING_DIR}"`
3232
3333Содержимое этой папки раскрывается далее в этой статье
3434
3535### Промежуточная папка. Завершение
3636
3737Прочитайте раздел *Структура папок*, чтобы добавить необходимые файлы. После чего Вы можете завершить работу с этой папкой.
3838
3939Папки и файлы в этом архиве предполагаются только для чтения (ReadOnly). Чтобы убедиться в этом Вы можете перед вызовом **dpkg-deb** сделать нижеследующее:
4040
4141`find "${STAGING_DIR}" -type d -exec chmod 0755 {} \;  #установить атрибуты папок`\
4242`find "${STAGING_DIR}" -type f -exec chmod 0644 {} \;  #установить атрибуты файлов`\
4343`find "${STAGING_DIR}/usr/bin" -type f -exec chmod 0755 {} \;  #установить атрибуты для исполняемых файлов`
4444
4545Когда у Вас будут собраны все нужные файлы в промежуточной папке, Вы можете определить установочный размер и добавить его в файл **control**:
4646
4747`SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"`\
4848`echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"`
4949
5050### Создание Deb архива
5151
5252Как только структура папок будет готова Вы можете создать архив с помощью:
5353
5454`dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
5555
5656Или для более старых версий dpkg-deb:
5757
5858`fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"`
5959
6060`${STAGING_DIR}` это путь к структуре папок для сжатия. `${PACKAGE_NAME}` это имя файла, которое будет использоваться для архива.
6161
6262Как правило Вы создаете архив под обычным пользователем, а не с *root* аккаунта. Но установочные файлы должны принадлежать определенному пользователю. Используя флаг `--root-owner-group` или префикс **fakeroot** Вы сохраните в архиве информацию о принадлежности файлов *root* пользователю.
6363
6464После этого вам, вероятно, больше не понадобится промежуточная папка, поэтому вы можете удалить его:
6565
6666`rm -rf "${STAGING_DIR}"`
6767
6868### Проверка архива
6969
7070После того, как вы создали пакет, вы можете проверить, что он соответствует рекомендациям с помощью команды **lintian**:
7171
7272`lintian "${PACKAGE_NAME}.deb" --info`
7373
7474Здесь приведен список возможных проблем: <https://lintian.debian.org/tags.html>
7575
7676В Lazarus Вы по умолчанию получите предупреждения `hardening-no-pie` (и `hardening-no-windnow`). Чтобы избежать такие предупреждений добавьте следующие параметры компилятора в параметры проекта:
7777
7878`-Cg`\
7979`-k-pie`\
8080`-k-znow`
8181
8282## Структура папок
8383
8484Ниже приведена структура промежуточного каталога, который вам необходимо подготовить.
8585
8686`staging (промежуточный каталог)`\
8787`  ├─ DEBIAN`\
8888`  └─ usr`\
8989`      ├─ bin`\
9090`      └─ share`\
9191`          ├─ project1       #ресурсы для Вашего пакета`\
9292`          ├─ applications   #ярлыки`\
9393`          ├─ pixmaps        #значок по умолчанию`\
9494`          ├─ icons`\
9595`          │   └─ hicolor    #значки различных размеров`\
9696`          ├─ doc`\
9797`          │   └─ project1   #информация о Вашем пакете`\
9898`          └─ man            #руководство пользователя`\
9999`              └─ man1       #оглавление`
100100
101101### Папка DEBIAN
102102
103103Имя этого каталога указано в верхнем регистре. Он должен содержать один файл под названием **control**. Ниже пример пакета под названием **project1** в версии 2.0.
104104
105105`Section: graphics`\
106106`Priority: optional`\
107107`Maintainer: myname <myname@webserver.com>`\
108108`Homepage: `[`https://www.project1.com`](https://www.project1.com)\
109109`Package: project1`\
110110`Architecture: amd64`\
111111`Version: 2.0`\
112112`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`\
113113`Description: Это тестовый проект.`\
114114` Длинное описание бла-бла-бла.`
115115
116116Примеры значений для поля **Section**: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.
117117
118118Поле **Architecture** используется для компиляции программы. Чтобы узнать текущую архитектуру, используйте следующую команду:
119119
120120`dpkg --print-architecture`
121121
122122Поле **Depends** содержит список используемых Linux библиотек. Вы можете получить этот список с помощью следующих команд, выполняемых в папке вашего бинарного файла:
123123
124124`mkdir debian                 #требуется папка debian`\
125125`touch debian/control         #с одним файлом control в нем`\
126126`dpkg-shlibdeps -O project1   #предполагается, что ваш бинарный файл называется project1`
127127
128128Затем вы можете удалить почти пустую папку *debian*, если вы ее не используете.
129129
130130Все это выведет зависимости (после знака равенства):
131131
132132`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`
133133
134134Для полноты следует отметить, что все эти пакеты не являются абсолютно необходимыми, поскольку несколько пакетов в этом списке уже могут быть частью зависимостей - и, следовательно, частью установки - другого пакета, указанного в этом же списке (см. [1](https://wiki.freepascal.org/Deploying_Your_Application#Tip%3A) для перекрестной проверки и устранения лишних зависимостей).
135135
136136### Папка usr/bin
137137
138138Эта папка содержит бинарный файл и только его (*для информации: избегайте символа подчеркивания в имени Вашего проекта - для примера, dpkg-deb избегает этого - потому что имя пакета должно удовлетворять регулярному выражению: \${PackageName}_\${Version}_\${Arch}.deb, e.g. dpkg-dev_1.19.0.5ubuntu2_all.deb*). Все ресурсные файлы должны быть помещены в *usr/share/project1*. Для доступа к ресурсам Ваша программа может использовать относительный путь наподобии *../share/project1*.
139139
140140Папка *usr/local/bin* недопустима в пакете [2](https://lintian.debian.org/tags/file-in-usr-local.html) потому что *local* используется проектами, компилируемыми локально и установленные с помощью их Makefile.
141141
142142### Папка ресурсов
143143
144144Она будет называться *usr/share/project1*, если имя пакета "project1".\
145145Вы можете разместить там все файлы данных, нужные Вашей программе. Обращаем внимание, что они будут "только для чтения".
146146
147147### Папка конфигурации
148148
149149Существуют разные места для размещения [[Multiplatform Programming Guide/ru|конфигурационных файлов]]. Конфигурационные файлы (или файлы настроек) должны быть изначально созданы самим приложением (значениями по умолчанию), если их не существует в момент старта приложения.
150150
151151### Папка usr/share/applications
152152
153153Чтобы добавить Ваше приложение в меню Linux, Вы должны добавить файл **project1.desktop**, содержащий:
154154
155155`[Desktop Entry]`\
156156`Name=Project1`\
157157`Comment=Cool project`\
158158`Icon=project1`\
159159`Exec=project1`\
160160`Terminal=false`\
161161`Type=Application`\
162162`Categories=Graphics`\
163163`GenericName=Project1`\
164164`Keywords=feature1; feature2; feature3`
165165
166166Этот файл напоминает "ярлык" для Вашей программы.
167167
168168Поле **Categories** как такое же в файле **control**. Это может быть для примера: Communication, Database, Development, Editors, Electronics, Fonts, Games, Graphics, Math, Internet, Networking, News, Science, Sound, Utility, Video.
169169
170170Поле keywords помогает в поиске в приложениях.
171171
172172Обратите внимание, что вам необходимо предоставить значок в виде файла PNG либо в каталоге *usr/share/pixmaps* либо в *usr/share/icons/hicolor*.
173173
174174#### Папка usr/share/pixmaps
175175
176176Будет содержать значок одного размера для ярлыка вашего меню в формате PNG под названием **project1.png**. Среднего размера, такого как 48x48, будет вполне достаточно.
177177
178178#### Папка usr/share/icons/hicolor
179179
180180Будет содержать значок нескольких размеров. Вот структура каталогов:
181181
182182`icons`\
183183` └─ hicolor`\
184184`     ├─ 8x8`\
185185`     │   └─ apps`\
186186`     ├─ 16x16`\
187187`     │   └─ apps`\
188188`     ...`
189189
190190Существует подкаталог для каждого возможного размера. Вы можете отобразить все размеры, определенные в настоящее время в вашей системе, написав:
191191
192192`ls /usr/share/icons/hicolor`
193193
194194В каждую папку приложений поместите изображение со всегда одним и тем же именем. Если ваш проект называется project1, то для большинства папок он будет называться "project1.png". В масштабируемые и символические папки вы можете поместить SVG-файл.
195195
196196### Папка документации
197197
198198Она будет называться *usr/share/doc/project1*, если имя пакета будет "project1".
199199
200200Папка содержит файлы **changelog.Debian.gz** и **copyright** и (необязательно) файл **README**.
201201
202202#### Файл журнала изменений
203203
204204Минимальный файл журнала изменений (changelog):
205205
206206`project1 (1.0) unstable; urgency=low`\
207-\
207+
208208`  * Первый релиз`\
209-\
209+
210210` -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100`
211211
212212Вы можете добавить множество строк, начинающихся с *, чтобы указать список изменений в версии. Пробелы в начале строки необходимы. Только строка, указывающая версию, начинается непосредственно в начале строки.
213213
214214Последняя версия должна быть в верхней части файла.
215215
216216Список изменений должен быть сжат с максимальной степенью. Для этого, предполагая что у вас уже есть несжатый файл **changelog**, сожмите его с помощью следующей команды:
217217
218218`gzip -9 -n usr/share/doc/project1/changelog.Debian`
219219
220220Флаги -9 -n необходимы, чтобы пакета соответствовал инструкциям.
221221
222222#### Файл copyright
223223
224224Если вы предоставляете пакет Deb самостоятельно, необязательно использовать машиночитаемый формат, однако это подготовит вас к публикации пакета в дистрибутивах Debian. См.: [[Debian package source|copyright in Debian package structure]].
225225
226226### Папка usr/share/man
227227
228228Содержит руководство пользователя, которое вы можете просмотреть с помощью команды **man**. Он должен содержать по крайней мере **project1.1.gz** в подкаталоге *man1*, который будет индексной страницей вашего руководства.
229229
230230Синтаксис немного своеобразен. Есть некоторые инструменты, которые могут помочь, но вам все равно нужно знать синтаксис.
231231
232232- описание синтаксиса: <https://liw.fi/manpages/>
233233- редактор с мастером и режимом предварительного просмотра WYSIWYG: **gmanedit**
234234- онлайн редактор с предварительным просмотром (переключитесь в режим AN): <https://roperzh.github.io/grapse/>
235235
236236Вот пример файла:
237237
238238`.TH Project1 1 "19 May 2020" "" Project1`\
239239`.SH NAME`\
240240`Project1 - My cool project`\
241241`.SH SYNOPSIS`\
242242`.B project1`\
243243`[PARAMETER]`\
244244`.SH DESCRIPTION`\
245245`What my program does.`\
246246`.PP`\
247247`More description.`
248248
249249Это руководство как и файл журнала изменений, должен быть сжат командой:
250250
251251`gzip -9 -n usr/share/man/man1/project1.1`
252252
253253Флаги -9 -n необходимы, чтобы пакет соответствовал инструкциям.
254254
255255---
256256*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