Ubuntu logo

Packaging Guide

6. Создание пакетов для новых программ

Хотя в архиве Ubuntu имеются тысячи пакетов, есть ещё много программ, которыми никто не занимается. Если вы знаете о какой-то замечательной программе, о которой, по вашему мнению, стоит узнать более широкому кругу пользователей, вы можете попробовать приложить свою руку к созданию пакета для Ubuntu или PPA. Это руководство проведёт вас через этапы создания пакета для новой программы.

Сначала вам следует прочитать статью Подготовка, чтобы подготовить свою среду разработки.

6.1. Проверка программы

Первым этапом создания пакета является получение tar-файла из апстрима («апстримом» мы называем авторов приложений) и проверка того, что он нормально компилируется и запускается.

Это руководство проведёт вас через процесс создания пакета для небольшого приложения GNU Hello, доступного на GNU.org.

Если у вас ещё нет инструментов сборки, установите их. Также установите все необходимые зависимости.

Установим инструменты сборки:

$ sudo apt-get install build-essential

Скачаем основной пакет:

$ wget -O hello-2.7.tar.gz "http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz"

Теперь распакуем основной пакет:

$ tar xf hello-2.7.tar.gz
$ cd hello-2.7

Это приложение использует систему сборки autoconf, так что нам нужно запустить ./configure для подготовки к компиляции.

При этом будет проверено наличие необходимых для сборки зависимостей. Поскольку hello — простой пример, build-essential обеспечит нас всем, что нужно. Для более сложных программ, команда завершится ошибкой, если у нас нет необходимых библиотек и файлов для разработки. Установите требуемые пакеты и повторите процесс, пока команда не завершится успешно.:

$ ./configure

Теперь нужно скомпилировать исходный код:

$ make

Если компиляция завершилась успешно, можно установить и запустить программу:

$ sudo make install
$ hello

6.2. Создание пакета

bzr-builddeb содержит модуль для создания нового пакета из шаблона. Этот модуль является обёрткой вокруг команды dh_make . Он уже должен быть у вас, если вы установили packaging-dev. Запустите команду, указав имя пакета, номер версии и путь к tar-архиву из апстрима:

$ sudo apt-get install dh-make bzr-builddeb
$ cd ..
$ bzr dh-make hello 2.7 hello-2.7.tar.gz

Когда он спросит тип пакета, выберите s: одиночный бинарник. Это импортирует код в ветку и создаст папку debian/. Взгляните на её содержимое: большинство автоматически созданных файлов требуются лишь для специализированных пакетов (например, модули Emacs), так что можно начать с удаления лишних файлов:

$ cd hello/debian
$ rm *ex *EX

Теперь нужно внести изменения в каждый из файлов.

В debian/changelog измените номер версии на версию Ubuntu: 2.7-0ubuntu1 (апстрим-версия 2.7, версия в Debian 0, версия в Ubuntu 1). Также смените unstable на текущий разрабатываемый выпуск Ubuntu, например, trusty.

Большая часть процесса компиляции пакета совершается скриптами из debhelper. Так как поведение debhelper меняется при выходе старшей версии, файл compat сообщает debhelper‘у какую именно версию использовать. Имеет смысл использовать наиболее свежую версию: 9.

Файл control содержит все метаданные пакета. Первый абзац описывает пакет исходных кодов. Второй и следующие абзацы описывают двоичные пакеты, которые должны быть собраны. Нам понадобится добавить пакеты, необходимые для компиляции приложения в Build-Depends:. Для hello он должен включать, как минимум:

Build-Depends: debhelper (>= 9)

Также нужно заполнить описание программы в поле Description:.

copyright нужно заполнить в соответствии с лицензией на источник из апстрима. Согласно файлу hello/COPYING, это лицензия GNU GPL 3 или более поздняя её версия.

docs должен содержать любые файлы документации из апстрима, которые, по вашему мнению, должны быть включены в готовый пакет.

README.source и README.Debian необходимы, лишь если ваш пакет имеет какие-то нестандартные функции. У нас таких нет, так что можно удалить эти файлы.

source/format можно оставить как есть, он описывает формат версии пакета исходного кода, который должен быть 3.0 (quilt).

rules — самый сложный файл. Это Makefile, который компилирует код и превращает его в двоичный пакет. К счастью, основную часть работы в наши дни автоматически выполняет debhelper 7, так что универсальная цель % просто запускает сценарий dh, который делает всё, что необходимо.

Все эти файлы подробнее описаны в статье обзор каталога debian.

Наконец, закоммитьте код в ветку для пакетов:

$ bzr add debian/source/format
$ bzr commit -m "Initial commit of Debian packaging."

6.3. Сборка пакета

Теперь нам нужно проверить, что наши исходные файлы для пакета успешно компилируются и собираются в двоичный .deb-пакет:

$ bzr builddeb -- -us -uc
$ cd ../../

bzr builddeb — это команда для сборки пакета в его текущем местоположении. -us -uc сообщает что подписывать пакет с помощью GPG не требуется. Результат будет помещён в каталог «..».

Просмотреть содержимое пакета можно с помощью:

$ lesspipe hello_2.7-0ubuntu1_amd64.deb

Установите пакет и проверьте, что он работает (позднее при желании вы сможете удалить его командой sudo apt-get remove hello):

$ sudo dpkg --install hello_2.7-0ubuntu1_amd64.deb

Можете также установить все пакеты сразу с помощью:

$ sudo debi

6.4. Дальнейшие шаги

Даже если двоичный .deb-пакет успешно собирается, ваши исходные файлы для пакета могут содержать ошибки. Многие ошибки могут автоматически обнаруживаться нашим инструментом lintian, который можно применить к файлу метаданных .dsc, двоичным пакетам .deb или файлу .changes:

$ lintian hello_2.7-0ubuntu1.dsc
$ lintian hello_2.7-0ubuntu1_amd64.deb

Чтобы увидеть подробное описание ошибок, используйте флаг lintian --info или команду lintian-info.

Результаты проверок архива Ubuntu можно найти в Интернете на http://lintian.ubuntuwire.org.

Для пакетов Python имеется также инструмент lintian4python, осуществляющий некоторые дополнительные проверки lintian.

После создания исправления для файлов пакета можно пересобрать его с параметром -nc (“no clean”), чтобы не начинать сборку с самого начала:

$ bzr builddeb -- -nc -us -uc

Убедившись, что пакет успешно собирается локально, вы должны проверить, правильно ли его сборка будет проходить в чистой системе, с помощью pbuilder. Поскольку вскоре мы собираемся загрузить его в PPA (персональный архив пакетов), эту загрузку нужно снабдить цифровой подписью, чтобы Launchpad мог удостовериться, что загрузку сделали вы (узнать о том, что загрузка будет подписана, можно по отсутствию передаваемых bzr builddeb флагов -us и -uc, которые мы использовали ранее). Для подписывания своей работы вам понадобится настроить GPG. Если вы ещё не настроили pbuilder-dist или GPG, сделайте это сейчас:

$ bzr builddeb -S
$ cd ../build-area
$ pbuilder-dist trusty build hello_2.7-0ubuntu1.dsc

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

$ bzr push lp:~<lp-username>/+junk/hello-package

Выгрузка в PPA позволит удостовериться, что пакет собирается нормально, а также позволит вам и остальным тестировать бинарные пакеты. Вам потребуется создать PPA на Launchpad, после чего выгрузить пакет с помощью dput:

$ dput ppa:<lp-username>/<ppa-name> hello_2.7-0ubuntu1.changes

Смотрите раздел «Загрузка» для дополнительной информации.

Попросить провести review можно на канале IRC #ubuntu-motu, или в списке рассылки MOTU. В некоторых случаях может потребоваться участие конкретной команды: в подобных случаях команда GNU поможет разобраться.

6.5. Отправка на включение

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

  • Debian Mentors FAQ - debian-mentors создан для менторства новых и перспективных разработчиков Debian. Это то место, где можно найти спонсора для загрузки Вашего пакета в архив.

  • Work-Needing and Prospective Packages - информация о том как отправлять баги “Intent to Package” (Назначение пакету) и “Request for Package” (Запрос пакета), а также списки открытых ITP и RFP.

  • Руководство Разработчика Debian, 5.1. Создание пакетов - бесценный документ для создателей пакетов как под Ubuntu, так и под Debian. Данная глава описывает процесс отправки новых пакетов.

В некоторых случаях имеет смысл отправляться прямо в Ubuntu. Например, если Debian находится в состоянии “freeze”: тогда ваш пакет врядли успеет войти в Ubuntu к ближайшему релизу. Этот процесс описан на странице “Новые Пакеты” Ubuntu Wiki.

6.6. Снимки экрана

Загрузив пакет в Debian, вам следует добавить снимки экрана, чтобы будущие пользователи смогли получить представление о том, как выглядит интерфейс программы. Снимки нужно отправлять на http://screenshots.debian.net/upload .