Debian package structure/ru

From Free Pascal wiki

English (en) русский (ru)

Установки в Debian выполняются файлами с расширением .deb. В этой статье рассматривается, как создать их вручную.

Если вы хотите разместить свою программу в дистрибутивы Debian, см. раздел как создать исходный код для Debian upstream.

Основной раздел

Два типа пакетов

Существует два типа пакетов: пакеты исходных кодов и бинарный пакет. В этой статье будет вестись речь о бинарных пакетах. Бинарные пакеты представляют удобный способ консолидации предварительно скомпилированных бинарных файлов, готовых для предоставлению непосредственно конечному пользователю. Однако дистрибутивы наподобии Debian или Ubuntu не смогут принять бинарные пакеты в свои репозитарии, они требуют Debian-пакеты исходных кодов (source package), которые могут использоваться для сборки бинарных версий в случае необходимости. Пакеты исходных кодов Debian (source package) несколько сложнее собрать и подчиняется ряду технических и юридических правил, прежде чем могут быть приняты в большинстве дистрибутивов Linux.

Подготовка пакетов

В бинарном пакете Debian файлы установки сжимаются с использованием команды dpkg-deb. Вы можете увидеть содержимое сформированных .deb файлов также как и любых других упакованных архивов, нажав правую кнопку мыши на них и открывая их в менеджере архивов (т.е. в обычном архиваторе).

Чтобы сделать .deb файл, Вам следует подготовить структуру папок с соответствующими файлами. Это будет называться промежуточной папкой и выражено в этой статье переменной ${STAGING_DIR}. Вы можете заменить его подходящей папкой или определить эту переменную в скрипте.

Вы можете для примера создать эту промежуточную папку как поддиректорию текущей папки. Простейший скрипт будет таким:

STAGING_DIR=./staging
mkdir ${STAGING_DIR}

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

cd `dirname $0`
STAGING_RELATIVEDIR="./staging"
STAGING_DIR=$(readlink --canonicalize "${STAGING_RELATIVEDIR}")

Также вам может потребоваться удалить существующий промежуточный каталог, чтобы убедиться, что он пуст:

rm -rf "${STAGING_DIR}"
mkdir "${STAGING_DIR}"

Содержимое этой папки раскрывается далее в этой статье

Промежуточная папка. Завершение

Прочитайте раздел Структура папок, чтобы добавить необходимые файлы. После чего Вы можете завершить работу с этой папкой.

Папки и файлы в этом архиве предполагаются только для чтения (ReadOnly). Чтобы убедиться в этом Вы можете перед вызовом dpkg-deb сделать нижеследующее:

find "${STAGING_DIR}" -type d -exec chmod 0755 {} \;  #установить атрибуты папок
find "${STAGING_DIR}" -type f -exec chmod 0644 {} \;  #установить атрибуты файлов
find "${STAGING_DIR}/usr/bin" -type f -exec chmod 0755 {} \;  #установить атрибуты для исполняемых файлов

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

SIZE_IN_KB="$(du -s ${STAGING_DIR} | awk '{print $1;}')"
echo "Installed-Size: ${SIZE_IN_KB}" >> "${STAGING_DIR}/DEBIAN/control"

Создание Deb архива

Как только структура папок будет готова Вы можете создать архив с помощью:

dpkg-deb --root-owner-group --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"

Или для более старых версий dpkg-deb:

fakeroot dpkg-deb --build "${STAGING_DIR}" "${PACKAGE_NAME}.deb"

${STAGING_DIR} это путь к структуре папок для сжатия. ${PACKAGE_NAME} это имя файла, которое будет использоваться для архива.

Как правило Вы создаете архив под обычным пользователем, а не с root аккаунта. Но установочные файлы должны принадлежать определенному пользователю. Используя флаг --root-owner-group или префикс fakeroot Вы сохраните в архиве информацию о принадлежности файлов root пользователю.

После этого вам, вероятно, больше не понадобится промежуточная папка, поэтому вы можете удалить его:

rm -rf "${STAGING_DIR}"

Проверка архива

После того, как вы создали пакет, вы можете проверить, что он соответствует рекомендациям с помощью команды lintian:

lintian "${PACKAGE_NAME}.deb" --info

Здесь приведен список возможных проблем: https://lintian.debian.org/tags.html

В Lazarus Вы по умолчанию получите предупреждения hardening-no-piehardening-no-windnow). Чтобы избежать такие предупреждений добавьте следующие параметры компилятора в параметры проекта:

-Cg
-k-pie
-k-znow

Структура папок

Ниже приведена структура промежуточного каталога, который вам необходимо подготовить.

staging (промежуточный каталог)
  ├─ DEBIAN
  └─ usr
      ├─ bin
      └─ share
          ├─ project1       #ресурсы для Вашего пакета
          ├─ applications   #ярлыки
          ├─ pixmaps        #значок по умолчанию
          ├─ icons
          │   └─ hicolor    #значки различных размеров
          ├─ doc
          │   └─ project1   #информация о Вашем пакете
          └─ man            #руководство пользователя
              └─ man1       #оглавление

Папка DEBIAN

Имя этого каталога указано в верхнем регистре. Он должен содержать один файл под названием control. Ниже пример пакета под названием project1 в версии 2.0.

Section: graphics
Priority: optional
Maintainer: myname <myname@webserver.com>
Homepage: https://www.project1.com
Package: project1
Architecture: amd64
Version: 2.0
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
Description: Это тестовый проект.
 Длинное описание бла-бла-бла.

Примеры значений для поля Section: comm, database, devel, editors, electronics, fonts, games, graphics, math, web, net, news, science, sound, utils, video.

Поле Architecture используется для компиляции программы. Чтобы узнать текущую архитектуру, используйте следующую команду:

dpkg --print-architecture

Поле Depends содержит список используемых Linux библиотек. Вы можете получить этот список с помощью следующих команд, выполняемых в папке вашего бинарного файла:

mkdir debian                 #требуется папка debian
touch debian/control         #с одним файлом control в нем
dpkg-shlibdeps -O project1   #предполагается, что ваш бинарный файл называется project1

Затем вы можете удалить почти пустую папку debian, если вы ее не используете.

Все это выведет зависимости (после знака равенства):

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

Для полноты следует отметить, что все эти пакеты не являются абсолютно необходимыми, поскольку несколько пакетов в этом списке уже могут быть частью зависимостей - и, следовательно, частью установки - другого пакета, указанного в этом же списке (см. [1] для перекрестной проверки и устранения лишних зависимостей).

Папка usr/bin

Эта папка содержит бинарный файл и только его (для информации: избегайте символа подчеркивания в имени Вашего проекта - для примера, dpkg-deb избегает этого - потому что имя пакета должно удовлетворять регулярному выражению: ${PackageName}_${Version}_${Arch}.deb, e.g. dpkg-dev_1.19.0.5ubuntu2_all.deb). Все ресурсные файлы должны быть помещены в usr/share/project1. Для доступа к ресурсам Ваша программа может использовать относительный путь наподобии ../share/project1.

Папка usr/local/bin недопустима в пакете [2] потому что local используется проектами, компилируемыми локально и установленные с помощью их Makefile.

Папка ресурсов

Она будет называться usr/share/project1, если имя пакета "project1".
Вы можете разместить там все файлы данных, нужные Вашей программе. Обращаем внимание, что они будут "только для чтения".

Папка конфигурации

Существуют разные места для размещения конфигурационных файлов. Конфигурационные файлы (или файлы настроек) должны быть изначально созданы самим приложением (значениями по умолчанию), если их не существует в момент старта приложения.

Папка usr/share/applications

Чтобы добавить Ваше приложение в меню Linux, Вы должны добавить файл project1.desktop, содержащий:

[Desktop Entry]
Name=Project1
Comment=Cool project
Icon=project1
Exec=project1
Terminal=false
Type=Application
Categories=Graphics
GenericName=Project1
Keywords=feature1; feature2; feature3

Этот файл напоминает "ярлык" для Вашей программы.

Поле Categories как такое же в файле control. Это может быть для примера: Communication, Database, Development, Editors, Electronics, Fonts, Games, Graphics, Math, Internet, Networking, News, Science, Sound, Utility, Video.

Поле keywords помогает в поиске в приложениях.

Обратите внимание, что вам необходимо предоставить значок в виде файла PNG либо в каталоге usr/share/pixmaps либо в usr/share/icons/hicolor.

Папка usr/share/pixmaps

Будет содержать значок одного размера для ярлыка вашего меню в формате PNG под названием project1.png. Среднего размера, такого как 48x48, будет вполне достаточно.

Папка usr/share/icons/hicolor

Будет содержать значок нескольких размеров. Вот структура каталогов:

icons
 └─ hicolor
     ├─ 8x8
     │   └─ apps
     ├─ 16x16
     │   └─ apps
     ...

Существует подкаталог для каждого возможного размера. Вы можете отобразить все размеры, определенные в настоящее время в вашей системе, написав:

ls /usr/share/icons/hicolor

В каждую папку приложений поместите изображение со всегда одним и тем же именем. Если ваш проект называется project1, то для большинства папок он будет называться "project1.png". В масштабируемые и символические папки вы можете поместить SVG-файл.

Папка документации

Она будет называться usr/share/doc/project1, если имя пакета будет "project1".

Папка содержит файлы changelog.Debian.gz и copyright и (необязательно) файл README.

Файл журнала изменений

Минимальный файл журнала изменений (changelog):

project1 (1.0) unstable; urgency=low

  * Первый релиз

 -- myname <myname@webserver.com>  Tue, 19 May 2020 11:06:00 +0100

Вы можете добавить множество строк, начинающихся с *, чтобы указать список изменений в версии. Пробелы в начале строки необходимы. Только строка, указывающая версию, начинается непосредственно в начале строки.

Последняя версия должна быть в верхней части файла.

Список изменений должен быть сжат с максимальной степенью. Для этого, предполагая что у вас уже есть несжатый файл changelog, сожмите его с помощью следующей команды:

gzip -9 -n usr/share/doc/project1/changelog.Debian

Флаги -9 -n необходимы, чтобы пакета соответствовал инструкциям.

Файл copyright

Если вы предоставляете пакет Deb самостоятельно, необязательно использовать машиночитаемый формат, однако это подготовит вас к публикации пакета в дистрибутивах Debian. См.: copyright in Debian package structure.

Папка usr/share/man

Содержит руководство пользователя, которое вы можете просмотреть с помощью команды man. Он должен содержать по крайней мере project1.1.gz в подкаталоге man1, который будет индексной страницей вашего руководства.

Синтаксис немного своеобразен. Есть некоторые инструменты, которые могут помочь, но вам все равно нужно знать синтаксис.

  • описание синтаксиса: https://liw.fi/manpages/
  • редактор с мастером и режимом предварительного просмотра WYSIWYG: gmanedit
  • онлайн редактор с предварительным просмотром (переключитесь в режим AN): https://roperzh.github.io/grapse/

Вот пример файла:

.TH Project1 1 "19 May 2020" "" Project1
.SH NAME
Project1 - My cool project
.SH SYNOPSIS
.B project1
[PARAMETER]
.SH DESCRIPTION
What my program does.
.PP
More description.

Это руководство как и файл журнала изменений, должен быть сжат командой:

gzip -9 -n usr/share/man/man1/project1.1

Флаги -9 -n необходимы, чтобы пакет соответствовал инструкциям.