Автор - Дмитрий Бородаенко (Debian Project, ex-SaM Solutions Dept6 head). Краткий вводный курс по пакетированию программного обеспечения средствами Debian/Ubuntu. Прочитан в апреле 2012 года для сотрудников отдела Linux & Embedded SaM Solutions. Публикуется по договоренности с лектором.
Видео: http://bit.ly/13Tw24s
4. 3. Постановка задачи пакетирования
◮ Разделение ОС на атомарные единицы – пакеты
◮ Установка, обновление и удаление пакетов
◮ Управление зависимостями
◮ Управление конфигурацией
◮ Контроль целостности
6. 5. debian/control
Source: package-name
Section: web
Priority: optional
Maintainer: Team 1 <team1@example.org>
Uploaders: John Doe <jdoe@example.org>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.9.3
Package: package-name
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Something useful
This package does something useful.
.
It can also be useless in some situations.
7. 6. debian/changelog
package-name (2.0-1) unstable; urgency=low
[John Doe]
* New upstream version:
- new foo-bar feature (Closes: #12345678).
[Jane Roe]
* Fixed typo in description.
-- John Doe <jdoe@example.org> Sun, 25 Mar 2012 15:56:38
8. 6. debian/changelog
package-name (2.0-1) unstable; urgency=low
[John Doe]
* New upstream version:
- new foo-bar feature (Closes: #12345678).
[Jane Roe]
* Fixed typo in description.
-- John Doe <jdoe@example.org> Sun, 25 Mar 2012 15:56:38
Добавить новую запись в debian/changelog: dch
Получить текущую дату в правильном формате: date --rfc-2822
9. 7. debian/copyright
Format: http://dep.debian.net/deps/dep5
Upstream-Name: package-name
Source: http://package-name.org/
Files: *
Copyright: 2012 Upstream Author <author@package-name.org>
License: GPL-3+
License: GPL-3+
The files hereby included are free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
.
On Debian systems, the full text of the GNU General Public
License version 3 can be found in the file
‘/usr/share/common-licenses/GPL-3’.
17. 12. Установочные скрипты: {pre,post}{inst,rm}
Правила работы с установочными скриптами:
1. Не связываться с установочными скриптами
18. 12. Установочные скрипты: {pre,post}{inst,rm}
Правила работы с установочными скриптами:
1. Не связываться с установочными скриптами
2. Пользоваться debhelper, он сам нагенерит всё, что надо
3. Если обойтись одним debhelper не выходит, не забывать в
рукописные скрипты добавлять строчку #DEBHELPER#
4. Всегда тестировать не только установку и обновление, но и
удаление пакета (и remove, и purge)
Policy 6 – Package maintainer scripts and installation procedure
21. 15. Собираем новый пакет с нуля
Создаём чистый репозиторий git:
mkdir package-name
cd package-name
git init
Втягиваем внешние исходники:
git-import-orig –pristine-tar -u2.0 ../package-name-2.0.tar.gz
Создаём рыбу пакета:
dh_make
git add debian/
Правим файлы в debian/, пока не соберётся:
git-buildpackage
Помечаем коммит версией пакета:
git commit
git tag debian/2.0-1
22. 16. git-buildpackage
Ветки:
◮ master – исходники пакета
◮ upstream – внешние исходники
◮ pristine-tar – дельта для воссоздания внешних архивов
Работа с патчами:
◮ gbp-pq import – создать ветку patch-queue/master из
содержимого debian/patches/
◮ git commit, git rebase -i, . . .
◮ gbp-pq rebase – переписать patch-queue/master под новый
внешний релиз
◮ gbp-pq export – сформировать набор патчей для quilt из
коммитов в patch-queue/master
23. 17. Управление конфигурационными файлами
Пакет должен предоставлять готовую конфигурацию,
соответствующую актуальной версии пакета, но не затирать
пользовательские изменения при обновлении (Policy 10.7).
1. Простейший случай:
/etc/package-name.conf
2. Уголок пользовательских настроек:
/etc/package-name.conf.local
/etc/package-name/conf.d/
3. Явное указание конфигурационных файлов:
debian/package-name.conffiles
debian/package-name.ucf
ucf умеет --three-way, но при неосторожном обращении может
сбивать dpkg с толку (dpkg -S, dpkg -P, dpkg-divert)
24. 18. debconf
debian/package-name.templates:
Template: package-name/foo
Type: string
Default: foo
Description: Enter foo
Please enter foo in the field below.
debian/package-name.config:
. /usr/share/debconf/confmodule
db_get package-name/foo
FOO=”$RET”
Документация:
◮ debconf-doc – debconf(7), debconf-devel(7)
◮ debian-policy – debconf_specification.*
25. 19. alternatives
Примеры: java, ruby, vi, x-terminal-emulator
Преимущества:
◮ переключение между целыми наборами альясов:
ruby + irb + ri + ман-страницы
◮ автоматический выбор набора с высшим приоритетом
Недостатки:
◮ требуется активное соучастие всех альтернативных пакетов
◮ все пакеты должны содержать одинаковый набор альясов
update-alternatives
--install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 10
--slave /usr/bin/irb irb /usr/bin/irb1.9.1
update-alternatives --remove ruby /usr/bin/ruby1.9.1
Документация: Policy F, update-alternatives(8)
26. 20. dpkg-divert
Примеры: dash, pentium-builder
Преимущества:
◮ можно защитить локальную версию файла от перезаписи
◮ можно отбирать любые файлы у любого пакета
Недостатки:
◮ каждый файл отбирается и отслеживается отдельно
◮ не умеет грабить награбленное
◮ не дружит с ldconfig, ucf
dpkg-divert --package pentium-builder --rename
--divert /usr/bin/gcc.real /usr/bin/gcc
dpkg-divert --package pentium-builder --rename
--remove /usr/bin/gcc
Документация: Policy G, dpkg-divert(8)
27. 21. Пакетирование демонов
Важные файлы:
debian/package-name.init
debian/package-name.default
debian/package-name.logrotate
debian/package-name.useful.udev
Памятка демоновода:
1. Параметры запуска демона устанавливаются в default
2. Каталог /run очищается при перезагрузке, так что
/run/package-name/ надо создавать в init, а не в postinst
3. Вывод сообщений: . /lib/lsb/init-functions
4. Демонизация: start-stop-daemon
https://wiki.debian.org/LSBInitScripts
Policy 9.3 – System run levels and init.d scripts
Policy 10.8 – Log files
29. 23. gem2deb
Сделать рыбу пакета: gem2deb ruby-pg-0.11.0.tar.gz
debian/rules:
%:
dh $@ --buildsystem=ruby --with=ruby
Дополнительные шаги:
1. Убрать все упоминания require ’rubygems’
2. Проверить ruby-test-files.yaml, при необходимости заменить
на ruby-tests.rb
3. Если пакет работает не со всеми версиями Ruby, поправить
XS-Ruby-Versions
https://wiki.debian.org/Teams/Ruby/Packaging