2010-04-19

Создаем DEB-пакет

Сегодня мы будем учиться готовить стандартные Debian-ские пакеты.
Оказывается, это не так сложно, и к тому же интересно.

Немного информации о пакете

Если вкратце, то deb-пакет - это ar-архив, распаковать который можно так:
$ ar x mydebpackage.deb

В результате мы увидим извлеченные файлы:
data.tar.gz (tar-архив с файловой структурой, копируемой в систему при установке)
debian-bynary (файл с номером версии формата пакетов)
control.tar.gz (tar-архив управляющей информации о пакете)

В файле control.tar.gz содержатся интересные вещи:
- postinst (скрипт, выполняемый после установки)
- postrm (скрипт, выполняемый после удаления)
- md5sums (контрольные суммы файлов)
- control (остальная метаинформация)

Например, в control может быть примерно такое содержимое:

Package: mypackage (название пакета)
Version: 0.1 (версия)
Depends: liba, libb1, libc2 (зависимости)
Recommends: libpamparam, lalala (рекомендовано)
Suggests: libbestdeb (могут улучшить работу пакета)
Section: utils
Priority: optional
Description: My best package! But for what?...



Создаем свой DEB

Чтобы создать deb-пакет, у нас есть все, что нужно. К примеру, я хочу собрать пакет видео-утилит, назовем его videotools.
В него войдут bash-скрипты для извлечения из видеофайлов отдельно аудио-дорожки, видео-дорожки, конвертирования avi в flv и обратно.

Для начала, создаем структуру каталогов.

videotools (каталог, в котором все остальное)
- DEBIAN/control (каталог DEBIAN с файлом control)
- usr/local/bin/getaudio (этот и остальные - мои скрипты)
- usr/local/bin/getvideo
- usr/local/bin/flv2avi
- usr/local/bin/avi2flv

Содержимое файла control будет примерно таким:

Package: videotools
Version: 0.1
Maintainer: Kawaikunee <secret@mail>
Description: Contaned scripts getaudio, getvideo, flv2avi, avi2flv
Section: utils
Priority: optional
Architecture: all
Depends: bash, mplayer, mencoder

Архитектуру указываю любую, это же просто bash-скрипты.

Теперь собираем пакет:
$ dpkg-deb --build videotools
И получаем файл videotools.deb

Трубим в фанфары и кушаем мороженое в честь успеха.

Дополнительная информация

Виртуальный пакет - это общее имя, употребляемое к любому из пакетов некой группы, все пакеты из которой обеспечивают подобную базовую функциональность (например, программы для работы с электронной почтой).
Чтобы добавить файл в виртуальный пакет какой-либо функциональности, нужно указать это в файле control, например так:
Provides: mail-transport-agent
Чтобы сделать файл зависимым от чего-то общего, так:
Depends: mail-transport-agent

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

Создание DEB-пакета из исходников

Никакой магии. Устанавливаем пакет checkinstall (я уверен, не нужно вас учить, как это делается ^_^). Как обычно, в папке с распакованными исходниками делаем
$ ./configure && make
а вместо
$ sudo make install
набираем
$ sudo checkinstall
Такой финт ушами сначала создаст deb-пакет, а потом установит его через apt, что в дальнейшем обеспечит его корректное удаление, даже если разработчик не предусмотрел такой возможности. К тому-же, у нас останется пакет, который мы можем переслать друзьям, менее сведующим в этих консольных тонкостях, или которым это вовсе ни к чему.

Создание DEB-пакета для программ на Python

Для этого используем пакет py2deb(http://www.manatlan.com/page/py2deb). Приведены очень доступные примеры, а сам пакет скачивается там же, на сайте разработчика.
Например, вот скрипт, которым я упаковываю программу для изучения Библии. Оцените простоту!

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from glob import glob
from py2deb import Py2deb

p=Py2deb("bible")

p.author="Kawaikunee"
p.mail="secret@mail"
p.description="Программа в помощь изучающим Библию. Просмотр, поиск, параллельные места. Выделить текст и нажать клавишу F: поиск по выделенному. Клик на номере стиха: показать параллельные места. Клик на названии отрывка в найденном: открыть эту главу."
p.url = "http://kawaikunee.blogspot.com"
p.depends="python-gtk2, python, python-pysqlite2, msttcorefonts"
p.license="gpl"
p.section="utils"
p.arch="all"

p["/usr/bin"] = ["bible.py|bible","bible_iface.py","bible_shift.py"]
p["/usr/share/Bible/src"] = ["ot.png","nt.png","ap.png","ava.svg","bible_shift.xml"]
p["/usr/share/Bible/modules"] = ["modules/rst.sqlite|rst.sqlite","modules/kjv.sqlite|kjv.sqlite","modules/bible.db|bible.db"]
p["/usr/share/Bible"] = glob("modules/para/*")
p["/usr/share/applications"]=["Bible.desktop|Bible.desktop"]

p.generate("0.3.1")

Воодушевил? Дерзайте!

2 комментария:

Alexander комментирует...

Большое спасибо!

Анонимный комментирует...

Так а как со скриптом работать ? Скачал исходники, распаковал, а дальше ?