Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

Debian package structure/ru

English · Русский

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

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

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

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

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

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

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

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

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

text
STAGING_DIR=./staging
mkdir ${STAGING_DIR}

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

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

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

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

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

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

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

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

pascal
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:

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

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

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

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

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

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

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

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

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

text
rm -rf "${STAGING_DIR}"

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

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

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

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

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

text
-Cg
-k-pie
-k-znow

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

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

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

Папка DEBIAN

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

text
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 используется для компиляции программы. Чтобы узнать текущую архитектуру, используйте следующую команду:

text
dpkg --print-architecture

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

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

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

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

text
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, содержащий:

pascal
[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

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

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

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

text
ls /usr/share/icons/hicolor

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

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

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

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

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

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

text
project1 (1.0) unstable; urgency=low

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

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

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

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

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

text
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, который будет индексной страницей вашего руководства.

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

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

pascal
.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.

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

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

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


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.

Версия 3, последнее изменение: WikiArchive, .