Pull to refresh

Debian пакет с собственными скриптами: «Сделай сам»

Reading time6 min
Views391
В продолжение темы пользователя dreadatour, написавшего набор скриптов для заливки скриншотов на сервис clip2net, я решил показать, как можно собрать DEB пакет с собственными скриптами. Сам уже давно использую эту практику, удобно, если надо поделиться с кем-то или же взять с собой «к соседу» набор собственных утилит и не мучаться с зависимостями, вспоминая, что же ты там используешь, чтобы оно заработало.

Я не очень люблю dpkg-buildpackage, так как придется возиться с MakeFile'ами, а в данном случае оно все просто не нужно, скрипты не компилируются, а просто должны оказаться на своих местах. Поэтому собирать будем «совсем руками». Заодно покажу что же такое DEB пакет вообще и расскажу о некоторых «костылях», которые с ним можно иногда сотворить.

Итак, приступим! Нам понадобятся:
date, tar, gunzip, vi (nano, ee, kate, gedit), ar



Создаем каталоги!



Создаем каталог, в котором будут происходить все наши манипуляции:
$ mkdir -p ~/build/clip2net
$ cd ~/build/clip2net

ключ -p позволяет создать «полный» путь, даже если промежуточных каталогов еще не существует, он создаст и их. Это удобно, когда Вы хотите создать дерево каталогов, зная его структуру.

Создаем структуру каталогов наших скриптов (рекомендую использовать для этого каталог /usr/local/bin, чтобы не перекликаться с системными). Структуру создаем в нашей рабочей папке! Пишу полные пути, чтобы не запутались:
$ mkdir -p ~/build/clip2net/usr/local/bin
$ mkdir -p ~/build/clip2net/usr/local/share/doc/clip2net


в каталог ~/build/clip2net/usr/local/bin мы поместим исполняемые скрипты, а в ~/build/clip2net/usr/share/doc/clip2net документ о лицензировании и авторе, чтобы с ним можно было связаться в случае чего (пожелания, сообщить об ошибке и т.д.).

Готовим документацию



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

а так же файлы сопровождения приложения
changelog.Debian
copyright


все 4 представляют собой обычные текстовые файлы, по правилам надо указать кто собрал пакет, кто создал скрипты, а так же актуальную дату в формате RFC 2822. С этим нам поможет команда:
$ date -R
Sat, 12 Dec 2009 01:29:00 +0300


К сожалению я не поинтересовался именем Dreadatour, да и сам не являюсь мейнтейнером Debian, поэтому ограничился никнеймами вместо реальных имен. Так же взял на себя смелость лицензировать скрипты под GPLv2, если Dreadatour пожелает — может изменить ее на что-то более либеральное, или же наоборот.

copyright:
This package was debianized by BaBL <babl1986@gmail.com> on
Sat, 12 Dec 2009 01:29:00 +0300.

The current maintainer is BaBL <babl1986@gmail.com>.

It was downloaded from:

habrahabr.ru/blogs/linux/78006

Authors:

* Dreadatour.

Copyright © 2009-2010 Dreadatour

License:

The program is in the Public Domain.

The packaging is licensed under the GNU GPL License:

Copyright 2009, Dreadatour.

For the text of the GPL License in a Debian system, please see
`/usr/share/common-licenses/GPL-2'.


changelog.Debian:
в этом файле описываются все выходящие версии пакета и изменения в них
clip2net (2009.12.12-1) unstable; urgency=low

* Initial release.

-- Dreadatour <dreadatour.habrahabr.ru> Sun, 12 Dec 2009 01:30:27 +0300


changelog.Debian должен быть упакован архиватором gunzip, сделать это можно следующей командой:
$ gunzip -c changelog.Debian > changelog.Debian.gz


control:
этот файл содержит информацию о нашем приложении:
Package: clip2net
Version: 2009.12.12-1
Architecture: all
Maintainer: BaBL <babl1986@gmail.com>
Installed-Size: 100
Depends: zenity, scrot, xclip
Section: web
Priority: extra
Homepage: habrahabr.ru/blogs/linux/78006
Description: upload screnshots to clip2net web service.
clip2net is a small command-line program to upload and share
your screenshots with clip2net web service.

в общем-то здесь и так все понятно. Depends — это список пакетов, которые нужны для работы наших скриптов. Можно так же указать их версии, если у Вас есть жесткая привязанность к каким-то функциям, которые могут исчезнуть в будущих версиях пакетов. Все это делается в формате packagename (>= 1.1), в нашем случае функционал базовый, версии указывать не имеет смысла.

файл md5sums создадим позже, а теперь переходим непосредственно к сборке!

DEB пакет изнутри



Пакет представляет собой архив ar, в который запакованы 2 архива и текстовый файл с версией пакета (ныне 2.0) control.tar.gz data.tar.gz debian-binary. Давайте создадим их все.

С самими скриптами, думаю, все понятно. Берем их из соседней темы: habrahabr.ru/blogs/linux/78006 и кладем в наш usr/local/bin/:
$ chmod +x ~/build/clip2net/usr/local/bin/*
$ ls ~/build/clip2net/usr/local/bin/ -l
итого 8
-rwxr-xr-x 1 babl babl 2256 Дек 12 01:18 clip2net
-rwxr-xr-x 1 babl babl 1738 Дек 12 01:21 clip2net-uploader

то же самое делаем с файлами сопровождения:
$ ls ~/build/clip2net/usr/local/share/doc/clip2net/ -l
итого 8
-rw-r--r-- 1 babl babl 152 Дек 12 01:27 changelog.Debian.gz
-rw-r--r-- 1 babl babl 516 Дек 12 01:30 copyright


теперь создадим файл чексумм:
у команды md5sum нет рекурсивного режима, если файлов мало — можно вызвать ее несколько раз и собрать все данные в файл, но если много — лучше воспользоваться md5deep.
~/build/clip2net/$ md5deep -r usr > md5sums
$ cat md5sums
ce3819f05bdba9f9ca25e72b4af16c13 usr/local/share/doc/clip2net/changelog.Debian.gz
3b4bb44167a1b04ce855d4925a5166d8 usr/local/share/doc/clip2net/copyright
855704c1c7cc003737a4d3028af50a35 usr/local/bin/clip2net
c4a1385cdc01c4ff34b987533d590d19 usr/local/bin/clip2net-uploader


так же не стоит забывать, что пользователя babl на компьютерах других людей нет, поэтому все файлы отдадим root'у:
$ sudo chown -R root:root ~/build/clip2net/usr


Все, у нас все готово.

Собираем пакет



итак, нам надо получить 3 файла: control.tar.gz data.tar.gz debian-binary. Все выполняем из папки ~/build/clip2net

debian-binary
$ echo '2.0' > ./debian-binary


control.tar.gz
$ tar czvf control.tar.gz control md5sums


data.tar.gz
$ tar czvf data.tar.gz usr


а теперь соберем deb пакет:
ar -r clip2net_2009.12.12-1_all.deb debian-binary control.tar.gz data.tar.gz


Проверяем на вшивость



попробуем установить наш новенький пакет:
babl@localhost:~$ sudo dpkg -i clip2net_2009.12.12-1_all.deb
[sudo] password for babl:
Выбор ранее не выбранного пакета clip2net.
(Чтение базы данных ... на данный момент установлено 298876 файлов и каталогов.)
Распаковывается пакет clip2net (из файла clip2net_2009.12.12-1_all.deb)...
dpkg: зависимости пакетов не позволяют настроить пакет clip2net:
clip2net зависит от scrot, однако:
Пакет scrot не установлен.
clip2net зависит от xclip, однако:
Пакет xclip не установлен.
dpkg: не удалось обработать параметр clip2net (--install):
проблемы зависимостей -- оставляем не настроенным
При обработке следующих пакетов произошли ошибки:
clip2net
babl@localhost:~$

упс… ошибка… в системе не установлены зависимости, придется поставить:
babl@localhost:~$ sudo apt-get install xclip scrot giblib1
Чтение списков пакетов... Готово
Построение дерева зависимостей
Чтение информации о состоянии... Готово
НОВЫЕ пакеты, которые будут установлены:
giblib1 scrot xclip
обновлено 0, установлено 3 новых пакетов, для удаления отмечено 0 пакетов, и 478 пакетов не обновлено.
не установлено до конца или удалено 1 пакетов.
Необходимо скачать 57,2kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 233kB.
Получено:1 mirror.yandex.ru unstable/main giblib1 1.2.4-5 [20,1kB]
Получено:2 mirror.yandex.ru unstable/main scrot 0.8-11 [17,7kB]
Получено:3 mirror.yandex.ru unstable/main xclip 0.12-1 [19,3kB]
Получено 57,2kБ за 0с (636kБ/c)
Выбор ранее не выбранного пакета giblib1.
(Чтение базы данных ... на данный момент установлено 298881 файлов и каталогов.)
Распаковывается пакет giblib1 (из файла .../giblib1_1.2.4-5_i386.deb)...
Выбор ранее не выбранного пакета scrot.
Распаковывается пакет scrot (из файла .../archives/scrot_0.8-11_i386.deb)...
Выбор ранее не выбранного пакета xclip.
Распаковывается пакет xclip (из файла .../archives/xclip_0.12-1_i386.deb)...
Обрабатываются триггеры для man-db ...
Настраивается пакет giblib1 (1.2.4-5) ...
Настраивается пакет scrot (0.8-11) ...
Настраивается пакет xclip (0.12-1) ...
Настраивается пакет clip2net (2009.12.12-1) ...
babl@localhost:~$

все, все пакеты установились корректно и clip2net занял свое достойное место в нашей системе. Пусть первая попытка установки вас не пугает, если залить этот пакет на какой-нибудь репозиторий, или же создать свой, apt сам найдет и установит зависимости.

Как применить полученные знания?


Иногда при установке левого пакета, бывает, что какие-то зависимости конфликтуют с установленной системой, а режим установки --force лучше не использовать вообще, он может сильно нагадить в последствие. Но что, если «конфликтующий» функционал нами не будет востребован, а решаемые задачи могут быть полностью удовлетворены? Чтобы не пересобирать пакет полностью, можно попробовать просто поправить его зависимости.

Дабы не быть голословным, у меня сейчас 2 таких пакета: wl-assistant (ну нравится он мне, но «официально» не ставится уже давно) и katapult (да, знаю, есть klauncher, но мне не нравится. К счастью Linux дает свободу выбора). Как правило dpkg или apt говорит что приложение не может быть установлено, так как в системе одна версия пакета, а нужна другая, но ее установить нельзя. Очень часто это всего-лишь «предосторожности», когда мейнтейнер не может 100% гарантировать совместимость, либо из-за нехватки времени для тестирования, либо еще по каким причинам, так что в большинстве случаев данное действие будет абсолютно безопасно. Тем не менее отдавайте себе отчет в том, что за перепакованный пакет вся ответственность лежит полностью на вас. С другой стороны, удалить его в любой момент никто нам не помешает.

распаковываем deb пакеты этих приложений:
$ ar x ~/Downloads/katapult_0.3.2.2-2_i386.deb

и видим старые знакомые файлы:
$ ls
control.tar.gz data.tar.gz debian-binary

нас интересует все тот же control, распакуем архив control.tar.gz, отредактируем зависимости (список Depends:), запакуем все что из него вылезло обратно и упакуем deb пакет. Все эти манипуляции я уже расписал, после них приложение установится как ни в чем не бывало.

P.S.: упаковывайте свои скрипты в пакеты. В будущем это может сэкономить время и нервы.

Tags:
Hubs:
+41
Comments20

Articles