Создание пакета Debian с нуля является своего рода волшебным процессом. Вы могли бы начать гуглить с запросом “Создание пакета Debian с нуля” и получить множество результатов, ни один из которых не стал бы тем, который Вам необходим. Несомненно, Вы найдете большой обзор команд, которые используются в Debian и, если Вы роете достаточно глубоко, Вы сможете все же найти пару команд, которые помогут создать базовый пакет Debian, но не смогут объяснить, что происходит. Более подробную информацию о том, что все же «происходит» Вы можете получить, в данном посте мы попробуем это частично затронуть.
Во-первых, необходимо начать с установки некоторых зависимостей. Все это руководство было сделано на основе Ubuntu 14.04, но подходит для большинства операционных систем на основе Debian. Выполните следующую команду, чтобы приступить к работе.
Sudo apt-get install build-essential dh-make
Mkdir mylittledeb touch mylittledeb/Makefile touch mylittledeb/hello.c
#include
Make-файл должен иметь следующее содержание. Информация для того, кто не знаком с Make-файлами - нужно применять «_», а не пробел или позже при выполнении некоторых команд Вы рискуете получить ошибки. Кроме того, обратите внимание, что очистка целевого элемента установлена ||true после удаления бинарного файла. Указанное рассогласование и другие элементы Debian мы будем использовать в дальнейшем запуская make clean перед созданием.
All: gcc hello.c -o hello clean: rm hello || true
В этой точке у Вас есть созданный пакет Debian, который позволит пользователям печатать «Hello, World». Это не самая интересная часть, но дальше будет больше. На этом этапе убедитесь, что запуск make производит бинарный вызов hello и запускает двоичные выводы «Hello, World». Если такого не произошло - значит, что-то пошло не так и это надо исправить, для того, чтобы двигаться дальше.
Наконец, мы можем приступить к фактическому созданию пакета! Чтобы инициализировать пакет Debian, мы будем использовать удобную dh_make программу, которую мы устанавливали раньше. При выполнении следующей команды с вводом тех же настроек, которые указаны ниже, Вы должны получить ошибку, но это плановая ошибка. В данном случае важно понять, что такое dh_make и как решить другие проблемы, с которыми Вы, вероятно, столкнетесь позже при работе с более усовершенствованными пакетами.
Dh_make -p mylittledeb_0.0.1
Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch?
s
Maintainer name: root
Email-Address: root@unknown
Date: Sun, 10 Apr 2016 14:38:32 -0400
Package Name: mylittledeb
Version: 0.0.1
License: blank
Type of Package: Single
Hit
Мы получили сообщение об ошибке. Теперь рассмотрим несколько вещей, которые касаются этой ошибки. Во-первых, что такое orig.tar.xz файл. Во-вторых, почему использовался флаг -p? Давайте начнем с простого вопроса. Флаг-p используется, потому что dh_make смотрит на имя директории, в которой Вы находитесь в настоящее время, чтобы выяснить имя пакета и версию. Многие могут согласится, что глупо вызывать каталог таким путем, поэтому флаг -p при первом выполнении dh_make передает данные в виде <имя пакета> _ <версия>.
Теперь давайте выясним, что за файл orig.tar.xz. Официальная документация говорит, что это - просто tarball исходного кода, который в нашем случае является просто текущим состоянием каталога. Однако, возможно, что-то особенное в этом orig.tar.xz файле есть. Поэтому давайте посмотрим, как он создается. Выполнение следующей команды позволит Вам снести исходный код для dh-make. Вы можете сделать это в tmp, так как потребуется очистить все файлы, если вы делаете это в вашем пакете mylittledeb.
Apt-get source dh_make
Теперь, когда есть исходный код, давайте посмотрим, что происходит. Открывая сценарий dh_make, можно найти внутри файл Perl. При поиске orig.tar.xz с Vim приходим к следующей строке.
System(‘tar’, ‘cfJ’, “../$package_name_$version.orig.tar.xz”, “.”);
Это просто старый архивный файл tar. Однако у Вас должно быть некоторое понимание того, что все эти волшебные Debian сценарии делаются на случай, если все пойдет не так. Теперь давайте вернемся в нашу папку mylittledeb и запустим следующее:
Dh_make -p mylittledeb_0.0.1 --createorig
Теперь вы должны увидеть папку DEBiAN в вашей папке mylittledeb со следующим содержимым:
Changelog compat control copyright docs init.d.ex manpage.1.ex manpage.sgml.ex manpage.xml.ex menu.ex mylittledeb.cron.d.ex mylittledeb.default.ex mylittledeb.doc-base.EX postinst.ex postrm.ex preinst.ex prerm.ex README.Debian README.source rules source watch.ex
Файлы.ex и.EX являются примерами файлов. В большинстве из них нет никакой необходимости.
changelog - этот файл управляет Вашей версией пакета, а также кратко приводит объяснение о том, что изменилось, начиная с последнего обновления. Вот то, на что должен быть похож основной файл.
Mylittledeb (0.0.1–1) unstable; urgency=low
* Initial release (Closes: #nnnn)
"mylittledeb" будет содержать в названии "0.0.1" это версия пакета и "1" в конце это - версия Debian. Нестабильный дистрибутив, для которого пакет Debian является целевым и переноса на различные дистрибутивы, сделан за пределами этого процесса. В данном случае мы просто будем использовать trusty, так как все это строится на Ubuntu 14.04. После того, как Вы все сделали это выглядит примерно так:
Mylittledeb (0.0.1–1) trusty; urgency=low
* Intial package release
- root
Последняя строка должна содержать имя, связанное с ключом GPG, если вы хотите подписать свои пакеты. Но мы еще дойдем до подписи пакета. На данный момент Вы можете проигнорировать этот пункт.
compat - это волшебный файл, и Вы должны всегда использовать цифру 9. Это - примерно единственная информация, которую Вы можете найти на нем. Почему именно 9? Ну, она используется всеми инструментами в пакете debhelper , это будет гарантировать, что ваш файл Debian совместим.
control - файл управления содержит версию, независимую информацию о Вашем пакете, которую увидят люди при выполнении "apt-cache show mylittledeb". Это все довольно хорошо объяснено в вики Debian . Ваш пакет должен выглядеть следующим образом.
Source: mylittledeb
Section: devel
Priority: optional
Maintainer: root
Нужно понимать, что сборка зависимостей должна быть построена правильно, так как включает в себя все зависимости для вашего пакета. Они не должны быть добавлены к Depends , который включает только зависимости, которые запускают Вашу программу. Здесь важно отметить, что {shlibs:Depends} и {misc:Depends} - это две волшебные строки, вызываемые командой dh_shlibdeps. Эта команда полезна для определения зависимостей, Ваших двоичных потребностей, которые не сразу очевидны.
copyright - это самый очевидный из файлов, и если Вы заинтересованы выпустить пакет в общий доступ, он просто обязан содержать данный файл.
docs - этот файл может перечислить имена всех файлов, которые вы хотели бы видеть включенными в комплект.
rules - файл правил Debian, содержит всю информацию о создании вашего пакет и является специальной версией Makefile. В файле указываются дополнительные цели, которые используются в создании файлов Debian. По умолчанию, это очень простой файл, который просто запускает основные команды. Тем не менее, если вам нужно что-то переопределить, например, как ваш каталог будет очищаться до сборки, Вам стоит сделать что-то вроде этого.
#!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 override_dh_auto_clean: rm /tmp/random.file %: dh $@
Все доступные переопределения перечислены в этой вики статье , а также более детальное описания файла правил. По умолчанию все инструменты debhelper используют этот файл таким образом, например, если мы хотим очистить директорию, это должно быть сделано перед созданием нового пакета, то выполняется следующая команда "dh clean". Эта команда в свою очередь вызывает dh_testdir, dh_auto_clean и dh_clean, что в свою очередь вызывает некоторые perl скрипты.
На данный момент править этот файл не нужно, но помните, что вы можете настроить функциональные возможности позже, если вам это нужно, когда вы делаете свой собственный пакет Debian.
source/format - этот файл кажется довольно простым. На данный момент Вы можете оставить его как есть. Просто знайте, что это формат компилирования, специфический способ применения патчей к восходящему тарболу который мы создали ранее.
*.install- этот файл не создается автоматически, так что вам нужно будет сделать файл с именем mylittledeb.install. Любой файл, который был добавлен с установкой, будет использоваться, чтобы установить двоичный файл. Файл или директория, расположенные в системе, используется при установке пакета. Так как у нас есть «hello world» двоичный файл, мы должны будем поместить это в пользовательскую систему. Следующий файл поместит наш «hello world» двоичный файл в пользовательскую директорию /usr/bin.
Hello /usr/bin
Остальная часть файлов, заканчивающихся на.ex и.EX, содержит описания того, что делают различные файлы. Их лучше же конечно сохранить, но и от удаления ничего страшного не произойдет.
Теперь простая часть. Выполните следующую команду.
Dpkg-buildpackage
Если раскомментировать export DH_VERBOSE=1 вы можете увидеть все команды, которые выполняются в данный момент. Все эти команды Вы можете переопределить, по этому в случае возникновения проблемы с своим собственным пакетом Вы сможете определить ее причину.
Вот вывод приведенной выше команды:
Dpkg-buildpackage: source package mylittledeb
dpkg-buildpackage: source version 0.0.1-1
dpkg-buildpackage: source distribution trusty
dpkg-buildpackage: source changed by root
Обратите внимание, что подписать изменения не удалось, потому что, как было сказано выше, ключ GPG не был создан. Это не страшно, даже не смотря на то, что получили такую ошибку пакет фактически был создан успешно.
Теперь Вы должны увидеть набор новых файлов в том же каталоге, где размещена Ваша папка mylittledeb. Нас интересует файл с названием «mylittledeb_0.0.1-1_amd64.deb», который может быть установлен с помощью команды:
Sudo dpkg -i mylittledeb_0.0.1–1_amd64.deb
Теперь вы должны иметь возможность запускать «Hello» из любого места на вашем компьютере, и получить текст «Hello, World».
Эта статья не завершена. Вы можете помочь в ее написании
Исправив стилистику статьи
Добавив больше информации о подготовке исходных кодов для дебианизации
Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT , которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное
./ configure && make && make install make uninstallно не все исходники это поддерживают, а что ещё чаще - исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).
Классификация случаев сборки
Возможны следующие случаи сборки пакетов:
Сборка из исходников;
Сборка из бинарных файлов;
исходники или бинарные файлы берутся:
Не из репозитория;
Из репозитория другого дистрибутива;
Из репозитория другого выпуска Ubuntu, из PPA или из Debian;
дебианизация:
Из другой версии программы;
Из текущей версии программы:
Не из репозитория текущего выпуска Ubuntu;
Из репозитория текущего выпуска Ubuntu;
Недоступна;
Берётся из репозитория Ubuntu, из PPA или из Debian:
причина сборки:
Ни в репозитории Ubuntu текущего выпуска, ни в PPA нет нужной версии программы;
Доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета);
И то, и другое.
Сборка из исходников
Что необходимо
Полное Руководство начинающего разработчика Debian доступно .
К сожалению, на русском, информация немного устарела, свежая инструкция доступна на английском. Но принципы не изменились, поэтому если интересны детали лучше прочитать руководство от и до.
Нам понадобятся как минимум программы, устанавливаемые командой
sudo apt-get install autoconf automake libtool autotools-dev dpkg-dev fakerootМожно так же autobook - это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.
Создание ключа шифрования
Этот шаг не обязателен, его можно пропустить.
Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования . В открывшемся окне, в меню Ключ → Новый ключ , выбираем ключ pgp . Заполняем поля Полное имя и Электронный адрес .
В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
Поэтому отнеситесь к созданию ключа очень ответственно.
Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол - думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.
Можно завести ящик, если ещё нет, на каком-нибудь популярном почтовом сервере: например, gmail.com или yandex.ru .
Это позволит в будущем легко связаться с вами человеку, который вас не знает, но по той или иной причине встретил «вещь», подписанную вами.
Далее вас спросят ввести пароль, как дополнительную защиту. Он может быть полезен, если вы будете использовать закрытый ключ на машинах, которым вы не можете на 100% доверять. Обратная сторона - вам придётся вводить пароль каждый раз, как только вы будете что-то подписывать.
Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME , и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.
Итак, вы создали ключ - теперь его можно будет использовать при создании пакетов.
Для этого, в файл ~/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh ~/.zshrc), нужно вписать переменные
Export DEBEMAIL=ваш@имейл
На основании e-mail будет искаться ключ в pgp, при подписи пакета.
Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой
для того, чтобы в изменения вписался ваш e-mail.
А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse
→ Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
Для этого, в меню Правка→Параметры
на закладке Публикация ключей
необходимо поставить галку Публиковать ключи…
.
Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи
.
Дебианизация недоступна
Итак, у нас есть только gcoolprog-0.5.3.tar.gz .
Обычно я выполняю следующие действия:
Предварительно подготавливаю рабочую директорию
"http://<путь до файла>" #можно конечно и просто через браузер скачать но обычно так быстрееПолучаем файл gcoolprog-0.5.3.tar.gz . Распакуем его перейдем в полученный каталог:
tar zxvf gcoolprog-0.5.3.tar.gz cd gcoolprog-0.5.3Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию!
./ configure --prefix =/ usr && makeЕсли команда выполнилась успешно, то осталось только дебианизировать.
Дебианизация
Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры - создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
Для этого, в корне исходных текстов, выполним
Dh_make --createorig
На что мы должны получить следующий диалог
Type of package: single binary, multiple binary, library, kernel module or cdbs?
s
Maintainer name: denis
Email-Address: [email protected]
Date: Mon, 13 Aug 2007 12:40:33 +0400
Package Name: gcoolprog
Version: 0.5.3
License: blank
Type of Package: Single
Hit
Тут мы указываем сформировать пакет, для одиночного бинарного файла.
Но мы с вами молодцы и всё у нас прошло без ошибок - появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение.ex) с примерами на все случаи жизни.
Description:
Вместо
Именно эти сведения увидит пользователь, когда посмотрит описание пакета.
Второй момент - это поправить файл debian/rules
в секции binary-arch
: нужно раскомментировать (т.е. убрать # в начале строки)
Dh_install
без этого мы получим пустой пакет.
Иногда debian/rules
содержит лишь:
%: dh $@
Что приемлемо с использованием debhelper.
Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.
Сборка пакета
Теперь, соберём пакет:
В директории выше, т.е. в ~/src/gcoolprog/0.5.3, мы получим файлы
Gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz
Вот теперь мы можем установить пакет
dpkg -i * .debДебианизация берётся из репозитория Ubuntu, из PPA или из Debian
Дебианизация берётся из другой версии программы
В этом случае, очень удобно взять дебианизацию оттуда и поправить для новой версии.
Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.
Ниже я не буду комментировать то, что описано в предыдущем решении.
mkdir ~/ src/ gcoolprog mkdir ~/ src/ gcoolprog/ 0.5.3 cd ~/ src/ gcoolprog/ 0.5.3 wget "http://<путь до файла>"получаем файл gcoolprog-0.5.3.tar.bz2
bunzip2 gcoolprog-0.5.3.tar.bz2 gzip gcoolprog-0.5.3.tar mv gcoolprog-0.5.3.tar.gz gcoolprog_0.5.3.orig.tar.gzтеперь распаковываем его
tar zxvf ./ gcoolprog_0.5.3.orig.tar.gzскачиваем предыдущую версию с http://packages.ubuntu.com или http://packages.debian.org , файл gcoolprog_0.5.1.diff.gz (в самом низу в секции More Information on gcoolprog)
wget "http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.1.diff.gz" gunzip gcoolprog_0.5.1.diff.gz patch -p0 < ./ gcoolprog_0.5.1.diffполучаем директорию
~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.1/ debianкопируем каталог gcoolprog-0.5.1/debian в директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3
cp -a ~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.1/ debian ~/ src/ gcoolprog/ 0.5.3/ gcoolprog-0.5.3 dch -iэтой командой изменяется файл debian/changelog например увидим
Gcoolprog (0.5.1-1ubuntu2) feisty; urgency =low * -- denis < ubuntu_user@ mail.ru>
но поскольку у нас версия 0.5.3, то нужно изменить значения на
Gcoolprog (0.5.3-1ubuntu1) feisty; urgency =low * New upstream release. -- denis < ubuntu_user@ mail.ru> Mon, 13 Aug 2007 14 :13 :27 +0400
сохраните изменения. Теперь можно выполнить команду сборки в пакет.
Dpkg-buildpackage -rfakeroot
получим файлы
cd .. ls -1 gcoolprog_0.5.3-1 .diff.gz gcoolprog_0.5.3-1 _i386.changes gcoolprog_0.5.3-1 _i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i * .debДебианизация берётся из текущей версии программы
Дебианизация берётся не из репозитория текущего выпуска Ubuntu
Для Debian нужно использовать сайт http://packages.debian.org , для Ubuntu - http://packages.ubuntu.com . Тогда, например, в Ubuntu ищем пакет gcoolprog в репозитории будущего релиза.
Предварительно подготовим рабочую директорию
теперь скачиваем три файла
wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .dsc wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3.orig.tar.gz wget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .diff.gzили тоже самое, но одной командой
Dget http:// archive.ubuntu.com/ ubuntu/ pool/ universe/ g/ gcoolprog/ gcoolprog_0.5.3-1 .dsc
из пакета devscripts
затем распакуем командой
Dpkg-source -x ./ gcoolprog_0.5.3-1 .dsc
получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:
cd gcoolprog-0.5.3 dch -i gcoolprog (0.5.3-1ubuntu1) feisty; urgency =low * backport from gutsy -- denis < ubuntu_user@ mail.ru> Mon, 13 Aug 2007 14 :13 :27 +0400теперь можно собирать пакет
Dpkg-buildpackage -rfakeroot
получим файлы
cd .. ls -1 . gcoolprog_0.5.3-1 .diff.gz gcoolprog_0.5.3-1 _i386.changes gcoolprog_0.5.3-1 _i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i * .debДебианизация берётся из репозитория текущего выпуска Ubuntu
В случае, когда для нужной версии программы имеется пакет в репозитории текущего выпуска Ubuntu, но он по каким-либо причинам не устраивает и в его исходники нужно внести изменения (например, применить какой-нибудь патч) и пересобрать, основываясь на уже имеющейся в пакете дебианизации, можно поступить следующим образом.
Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.
Скачиваем исходники:
cd ~/ src apt-get source gcoolprogapt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).
Устанавливаем необходимые для сборки пакеты для разработки:
sudo apt-get build-dep gcoolprogСобираем пакеты:
cd gcoolprog-0.5.3 debuild -b -us -ucdebuild следует запускать в директории исходников. Параметры -b -us -uc передаются программе dpkg-buildpackage. Первый требует собирать только бинарные пакеты, второй и третий - не подписывать цифровой подписью, соответственно, пакет исходников и файл.changes. Получившиеся в результате сборки пакеты будут в директории на один уровень выше.
Сборка из бинарных файлов
Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.
Предположим, что работаем в каталоге ~/tmp . Создадим подкаталог ~/tmp/someprog , чтобы распаковать файлы какого-нибудь пакета, нужно выполнить
dpkg -x ~./ tmp/ some-prog-123 .deb ./ someprogДля того, чтобы извлечь контрольную информацию, выполним
mkdir ~/ tmp/ someprog/ DEBIAN dpkg -e ~/ tmp/ some-prog-123 .deb ./ someprog/ DEBIANну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить
dpkg -b ./ someprog ~/ tmp/ some-prog-123 -new.debВ каталоге ~/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге ~/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin ,нужно его поместить в каталог ~/tmp/someprog/usr/bin , ну и, соответственно, если что-то должно лежать в /etc , то в ~/tmp/someprog/etc и т.д.
Затем в ~/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл ~/tmp/someprog/DEBIAN/control , в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:
Package: libcurl3
Version: 7.15.2-2
Section: libs
Priority: optional
Architecture: i386
Depends: libc6 (>= 2.3.5-1), libcomerr2 (>= 1.33-3), libidn11 (>= 0.5.18), libkrb53 (>= 1.4.2),
libssl0.9.8 (>= 0.9.8a-1),zlib1g (>= 1:1.2.1), ca-certificates
Suggests: libldap2
Replaces: libcurl2 (<< 1:7.11.2-2)
Installed-Size: 324
Maintainer: Domenico Andreoli
Ну а теперь собрать:
dpkg -b ./ someprog some-prog-123 -new.debЭтой информации достаточно, чтобы собрать/пересобрать простенький пакет. На самом деле можно ещё запускать скрипты при установке пакета, при его удалении и много чего ещё, что нужно нормальному maintainer"у.
deb-файл представляет собой архив в формате ar , содержащий установочные файлы программы, информацию о программе, а также скрипты (командные файлы), выполняемые до и после установки и удаления программы (наличие скриптов не является обязательным - они могут и не входить в состав пакета).
Формат файла deb описывается в man-справке (man pages) deb(5) - эта справка выводится, если в терминале набрать команду man deb. Также в Интернете есть немало страниц, содержащих эту информацию - достаточно набрать в строке поиска deb(5), чтобы найти их. Здесь это руководство не приводится, так как в официальном руководстве для разработчиков Debian, в справке по формату пакетов (которое на момент написания этого руководства находилось по адресу http://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html) написано, что формат пакетов может изменяться, а потому для работы с ними рекомендуестя использовать утилиту dpkg-deb. Справку по работе с утилитой dpkg-deb можно получить, набрав в терминале команду man dpkg-deb.
Работа программы GUI-deb как раз и заключается в создании директории, содержащей необходимые данные, и запуске программы dpkg-deb с указанием ей этой директории и других нужных параметров.
Правильная директория, нужная для создания установочного пакета программой dpkg-deb, должна, прежде всего, содержать вложенную директорию "DEBIAN". В этой директории должны находиться все данные, не копируемые в систему, а используемые непосредственно программами для работы с пакетами - информация о пакете, выполняемые до и после установки скрпиты и т.п. Никакие файлы, содержащиеся в директории DEBIAN, при установке пакета не попадут в файловую систему компьютера, на который устанавливается пакет.
Вне директории "DEBIAN" содержатся те файлы, которые будут скопированы в файловую систему компьютера, на который будет устанавливаться пакет. Файлы должны располагаться в тех директориях, в которые они будут помещаться при установке пакета. То есть, внутри директории, создаваемой для dpkg-deb, должна создаваться копия нужных нам частей файловой системы - так, как если бы эта директория являлась для неё корнем ("/"). То есть, допустим, если имя директории, на основе которой будет создаваться пакет - "~/TMP_DEBS/MyProgram", и нужно, чтобы при установке в файловой системе в директорию "/usr/share/pixmaps" записывался файл "MyProgram.png" - надо в директории "~/TMP_DEBS/MyProgram" создать директорию "usr", в ней - директорию "share", внутри "share" - директорию "pixmaps", и уже в директорию "pixmaps" поместить файл "MyProgram.png". В итоге, полный путь к файлу будет "~/TMP_DEBS/MyProgram/usr/share/pixmaps/MyProgram.png". При создании пакета часть директории "~/TMP_DEBS/MyProgram" будет обрезана, и при установке файл "MyProgram.png" как раз и попадёт по нужному адресу "/usr/share/pixmaps". Таким образом, нужные директории надо создать для каждого файла.
После создания директории остаётся только запустить dpkg-deb, передав нужные параметры. Самые необходимые для сборки пакетов параметры dpkg-deb описываются в разделе "Параметры командной строки для утилиты dpkg-deb" . В случае отсутствия ошибок в файле control, установочный пакет будет создан.
Go прекрасный язык. Одна из его супер-сил - это возможность собирать все в один бинарник. А это очень удобно, вы можете везде таскать этот файл и использовать на любой машине. Но хочется иметь возможность устанавливать нашу программу простым способом.
С помощью deb пакетов довольно просто можно организовать деплой на ваши сервера. При этом у вас будет версионирование и все такое. Я чаще всего использую ubuntu, поэтому речь будет именно о deb пакетах, которые можно установить/удалить с помощью утилит apt .
Что же нужно сделать, для создания своего репозитория с пакетами? Можно воспользоваться тем же launchpad.net , например. Но, последнее время, он не очень развивается и выглядит ненадежно. К тому же, его удобно использовать для своих не коммерческих разработок, но использовать его для дистрибуции корпоративного ПО будет проблематично.
Подойдем к проблеме с другой стороны. Во первых, нам нужно собирать deb пакеты, а это очень просто сделать самим с помощью утилиты dpkg-deb . Во-вторых, нам нужно где-то эти пакеты размещать, и для этого мы воспользуемся супер простым
Сборка пакетов
Для всех своих проектов я использую . Структура проекта выглядит примерно так:
Project/ |- bin/ | |- project |- src/ | |- github.com/ | |- 4gophers/ | |- project/ | |- main.go |- vendor/
Когда я запускаю gb build , то все бинарники собираются в папке bin . Таким образом, все что нам нужно - это просто добавить спецификацию нашего будущего deb пакета прям в папку с проектом:
Mkdir project/DEBIAN touch project/DEBIAN/control
В результате будет такая структура:
Project/ |- DEBIAN/ | |- control |- bin/ | |- project |- src/ |- vendor/
В файле control нужно указать информацию о нашем пакете. Не забывайте про пустую последнюю строку:
Package: project
Priority: optional
Section: devel
Installed-Size: 100
Maintainer: Ivan Ivanov
- Package - имя вашего пакета
- Priority - приоритет пакета (optional, extra, standard, important, required) для обычных программ лучше ставить optional
- Section - раздел к которому относится данный пакет (admin, base, comm, contrib, devel, doc, editors, electronics, embedded, games, gnome, graphics, hamradio, interpreters, kde, libs, libdevel, mail, math, misc, net, news, non-free, oldlibs, otherosfs, perl, python, science, shells, sound, tex, text, utils, web, x11)
- Installed-Size - размер файлов пакета в килобайтах
- Maintainer - имя и email создателя пакета
- Architecture - архитектура процессора, для которой предназначен пакет (i386, amd64, all, source, all)
- Version - версия пакета
- Depends - в данном поле необходимо указать имена пакетов, от которых зависит ваш пакет (например, библиотеки)
- Description - в первой строке пишем короткое описание пакета, в остальных более подробно
Все что находится в папке project попадет в пакет. И папка bin тоже. В этой папке лежит наш бинарный файл, который нужно установить. Чтобы ваши файлы оказались в нужной директории на компьютере пользователя, нужно создать соответствующую структуру каталогов внутри вашей папки с проектом.
Стоит отметить, что такой подход к созданию deb пакетов не самый правильный. Конечно, в нашем случае мы осознанно идем на этот шаг, но вам нужно понимать, что в deb пакет попадет все содержимое папки project , в том числе папки src , vendor и так далее. Конечно, можно скопировать файлы в другую папку, и даже написать скрипт для этого, но все уже придумано до нас. Более правильный способ - это использовать утилиты dh_make и dpkg-buildpackage .
Теперь можно собирать пакет. Для этого на уровень выше выполним команду:
Dpkg-deb -z8 -Zgzip --build project
На уровень выше будет создан файл project.deb , который можно устанавливать с помощью команды:
Sudo dpkg -i project.deb
Свой репозиторий пакетов
Теперь переходим к самому интересному. Как же нам распространять наши пакеты? Запустим свой сервер репозиториев, конечно же. А для этого воспользуемся сервером apt репозиториев deb-simple .
Это действительно простой сервер, который устанавливается всего одной командой:
Go get github.com/esell/deb-simple
Если go не установлен на той машине, где вы собираетесь запустить сервер с репозиториями, то вы можете собрать бинарник локально и просто скопировать его. Кроме этого, можно использовать docker.
Затем нужно запустить сервер. Это можно сделать с помощью docker, но мне больше нравится использовать supervisord . Вот пример моей конфигурации сервиса:
Command=/home/user/go1.5/bin/deb-simple directory=/home/user/deb-simple/ autorestart=true stdout_logfile=none
Тут важно указать путь к бинарнику(command) и рабочую папку(directory), в которой мы разместим наш конфиг.
Сервер deb-simple поддерживает https, но пока нам это не нужно. Для репозиториев нужно создать папку repo . Наш конфиг conf.json будет выглядит так:
{ "listenPort" : "9090", "rootRepoPath" : "/home/user/deb-simple/repo", "supportedArch" : ["all","i386","amd64"], "enableSSL" : false, "SSLcert" : "server.crt", "SSLkey" : "server.key" }
Чтобы загрузить пакет в свой репозиторий, нужно воспользоваться HTTP API самого сервиса:
Curl -XPOST "http://localhost:9090/upload?arch=amd64" -F "[email protected]"
Точно так же для удаления:
Curl -XDELETE "http://localhost:9090/delete" -d "{"filename":"project.deb","arch":"amd64"}"
Нам осталось добавить наш сервер репозиториев к списку в /etc/apt/source.list.d/ . Можно создать отдельный файл с содержимым:
Deb http://my-hostname:9090/ stable main
Теперь запускайте sudo apt-get update и устанавливайте свои программы сколько душе угодно.
Установка пакета checkinstall не должна вызвать особых сложностей. В операционных системах, использующих DEB пакеты, установка производится командой:
# sudo apt-get install checkinstall
В операционной системе, использующей RPM пакеты, установка пакета checkinstall выполняется командой:
# sudo rpm -i checkinstall
Если такой пакет в Вашей ОС не обнаружен, то Вам следует посетить домашнюю страницу проекта и скачать требуемую версию для Вашего дистрибутива:
http://checkinstall.izto.org/download.phpПереход в директорию с исходным кодом программы
Переход в директорию с исходным кодом программы достаточно прост и также не должен вызвать никаких затруднений.
Хотелось бы напомнить об очень удобном инструменте командной строки Linux - клавише TAB . Кнопка TAB позволяет автоматически дописывать название длинных директорий и файлов. Требуется ввести лишь первые символы названия директории / файла и нажать клавишу TAB , которая автоматически допишет полное название.
Почти все исходники распространяются в архивах формата tar.gz . Для разархивирования архива набираем команду:
Конфигурируем исходники под свою ОС
Проще говоря, это процесс «настройки» исходного кода под конкретную ОС. В результате этого процесса создается файл с описанием конфигурации. Конфигурирование исходников обычно осуществляется простой командой:
Эта команда не вносит никаких изменений в ОС и тем самым не сможет никак повредить ее.
Этот этап самый трудоемкий, так как необходимо установить все дополнительные пакеты, от которых зависит исходный код компилируемой программы. Если в ходе выполнения этой команды на экране появилось сообщение об ошибке и процесс конфигурирования остановился, то это значит что какой-то зависимый пакет отсутствует в системе.
К примеру, при конфигурировании Pidgin возникла ошибка:
checking for GTK... yes
checking for PANGO... yes
checking for X11... yes
checking for GTKSPELL... no
no
configure: error:
GtkSpell development headers not found.
Use --disable-gtkspell if you do not need it.
В приведенном листинге видно, что GTK, PANGA, X11 соответствуют требованиям компилируемого исходного кода (yes ), а проверка GTKSPELL вывела значение no . Скорее всего в этом примере требуется установить libgtkspell-dev .
Из этого примера видно, что это дело не такое уж и сложное. Если в процессе конфигурирования не возникло ошибок, то процесс считается завершенным успешно.
Компилирование исходников
Компилирование исходного кода - процесс «автоматический» при условии успешного выполнения предыдущего пункта.
Если все же возникают ошибки, то скорее всего это проблема в исходном коде. Нужно поместить часть строк вывода, в которых содержится ошибка, в любой поисковик и посмотреть результат поиска. Возможно с этой ошибкой уже сталкивалось интернет-сообщество.