Ubuntu Создаем deb-пакет с произвольным содержимым (на примере создания deb-пакета для утилиты gcconline)

Некоторое время назад я написал простой php-скрипт gcconline для сжатия javascript-файлов через онлайн-сервис Google Closure Compiler. Его можно скачать из github, однако обновлять таким образом скачанный скрипт на операционных системах Debian/Ubuntu не очень удобно. Учитывая, что теперь у меня есть deb-репозиторий, то самое время создать deb-пакет, который будет содержать скрипт gcconline. Этим мы сейчас и займемся…

Минимальный состав deb-пакета должен содержать сам скрипт или исполняемую программу, а также специальный файл с описанием пакета. Сам deb-пакет мы будем собирать с помощью утилиты dpkg-deb, которая входит в состав пакета dpkg-dev. Поэтому первым делом установим пакет dpkg-dev, если он еще не установлен:

sudo aptitude install dpkg-dev

Затем нужно создать каталог, в который мы поместим все необходимые исходные и служебные файлы. Назовем этот каталог debian и расположим его в домашнем каталоге. Внутри создадим структуру каталогов /usr/bin, а в нее скопируем скрипт gcconline. Именно по пути /usr/bin и будет устанавливаться наш скрипт после установки deb-пакета.

sudo mkdir -p ~/debian/usr/bin
cp /usr/bin/gcconline ~/debian/usr/bin

Затем нужно создать файл control, в котором должно содержаться описание deb-пакета. Сам файл должен лежать в каталоге DEBIAN:

sudo mkdir -p ~/debian/DEBIAN
sudo nano ~/debian/DEBIAN/control

Подробности о том, какое должно быть содержимое у файла control, можно найти на сайте debian.org. У меня получилось такое содержание файла с описанием пакета:

Package: gcconline
Version: 0.1-1
Section: utils
Priority: optional
Architecture: all
Depends: php5-cli (>= 5.1.2-1), php5-curl (>= 5.1.2-1)
Maintainer: Andrey Anosov <andrey@anosov.org.ru>
Description: JavaScript compression tool
 The Closure Compiler is a tool for making JavaScript download and
 run faster. It is a true compiler for JavaScript. Instead of compiling
 from a source language to machine code, it compiles from JavaScript
 to better JavaScript. It parses your JavaScript, analyzes it, removes
 dead code and rewrites and minimizes what's left. It also checks syntax,
 variable references, and types, and warns about common JavaScript pitfalls.

Все почти готово. Остается только собрать пакет и переименовать его согласно названиям других пакетов в Debian/Ubuntu:

sudo dpkg-deb --build ~/debian
sudo mv ~/debian.deb ~/gcconline_0.1-1_all.deb

Однако если подходить к вопросу сборки deb-пакета более серьезно, то выяснится, что мы забыли включить в состав deb-пакета несколько обязательных составляющих. В обнаружении недостающих компонентов нам поможет утилита lintian. Установим ее и проверим с ее помощью только что собранный deb-пакет:

sudo aptitude install lintian
lintian ~/gcconline_0.1-1_all.deb

В ответ получим две ошибки и одно предупреждение:

E: gcconline: no-copyright-file
E: gcconline: debian-changelog-file-missing
W: gcconline: binary-without-manpage usr/bin/gcconline

Наш deb-пакет не выглядит безупречным. Ну что же, исправим это. Подробное описание ошибок, выдаваемых утилитой lintian, можно найти на официальном сайте этой утилиты.

Итак, во-первых, мы должны поместить в deb-пакет файл ~/debian/usr/share/doc/gcconline/copyright примерно с таким содержимым:

Copyright 2011 Andrey Anosov <andrey@anosov.org.ru>
 
The home page of gcconline is at:
http://anosov.me/services#gcconline
 
The entire code base may be distributed under the terms of the GNU General
Public License (GPL), which appears immediately below.  Alternatively, all
of the source code as any code derived from that code may instead be
distributed under the GNU Lesser General Public License (LGPL), at the
choice of the distributor. The complete text of the LGPL appears at the
bottom of this file.
 
See /usr/share/common-licenses/(GPL|LGPL)

А во вторых, нужно создать файл ~/debian/usr/share/doc/gcconline/changelog.Debian.gz, в котором должна вестись история изменений, происходящих в различных версиях нашего пакета. Содержимое файла changelog.Debian получилось у меня таким:

gcconline (0.1-2) stable; urgency=low
 
  * Deb-package for gcconline.
 
 -- Andrey Anosov <andrey@anosov.org.ru>  Sun, 31 Jul 2011 22:00:00 +0300
 
 
gcconline (0.1-1) stable; urgency=low
 
  * First version of gcconline.
 
 -- Andrey Anosov <andrey@anosov.org.ru>  Thu, 14 Jul 2011 22:00:00 +0300

Не забудьте выполнить gz-сжатие файла changelog.Debian:

sudo gzip --best ~/debian/usr/share/doc/gcconline/changelog.Debian

После этого снова собираем deb-пакет и проверяем его утилитой lintian:

sudo dpkg-deb --build ~/debian
sudo mv ~/debian.deb ~/gcconline_0.1-1_all.deb
lintian ~/gcconline_0.1-1_all.deb

Ошибки должны исчезнуть. Предупреждение же binary-without-manpage связано с отсутствием man-страниц для нашей утилиты gcconline. Но вопрос создания man-страниц довольно обширен и заслуживает отдельной статьи. Поэтому пока оставим deb-пакет собранным с этим предупреждением.

Таким образом, наш простой deb-пакет готов. Его можно установить через менеджер пакетов или командой:

sudo dpkg -i ~/gcconline_0.1-1_all.deb

Также этот пакет можно разместить в репозитории (что я и сделаю в ближайшее время), что позволит всем легко и свободно устанавливать утилиту gcconline и использовать онлайн-сервис Google Closure Compiler из командной строки linux.