Сборка пакета Debian для сценария оболочки

Что: у меня есть сценарий оболочки, который я хочу распространить среди своей LUG. Я считаю, что пакет Debian будет самым простым способом его распространения. Я хочу создать файл .deb для скрипта в этом репозитории

Где: я хочу, чтобы он был помещен в какой-нибудь каталог, например /usr/local/bin, чтобы его было легко выполнить и, возможно, создать некоторые символические ссылки.

Проблема: как написать make-файл для него и/или другие файлы и папки, необходимые для этого. Я много исследовал, когда пытался сделать это пару месяцев назад, но тогда не повезло. Вот файлы из моей предыдущей попытки Теперь я пытаюсь упаковать это для учебника по оболочке script в моем LUG и снова столкнулся с похожей ситуацией.

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

Любые ресурсы или детали будут высоко оценены.

PS: Я также намерен в ближайшее время портировать скрипт на perl.


person Shubham Chaudhary    schedule 06.01.2014    source источник


Ответы (5)


Как сказал mirabilos, вы должны хотя бы взглянуть на учебник по упаковке, написанный Лукасом Нуссбаумом, нынешним руководителем проекта Debian. Вы можете установить его прямо из репозитория Debian:

# apt-get install packaging-tutorial

Затем откройте и просмотрите PDF-файл, расположенный по адресу /usr/share/doc/packaging-tutorial/packaging-tutorial.pdf. Изучив его, вы получите базовые знания, необходимые для понимания структуры пакета Debian.

Теперь давайте запачкаем руки. mv ваш скрипт в новый каталог. Имя каталога должно соответствовать номенклатуре upstreamname-*версия*.

rul@helicon:/tmp/a$ mkdir script-0.1
rul@helicon:/tmp/a$ mv script.sh script-0.1

cd в каталог, где находится ваш скрипт, и запустите dh_make --createorig. Выберите single binary. Теперь у вас будет каталог debian/ с большим количеством файлов. Эти файлы нужны вам для создания пакета. В вашем случае большинство, если не все файлы *.ex можно удалить. Прочтите и измените при необходимости оставшиеся файлы.

Теперь давайте напишем ядро ​​нашего пакета. Вы хотите установить скрипт в /usr/local/bin. Хорошая новость в том, что уже есть программа, которая делает это за вас. Вам просто нужно указать имя файла и куда его поместить. Это программа dh_install. Он имеет очень полный справочная страница. После прочтения вы должны понять, что вам нужно создать файл install в каталоге debian/.

rul@helicon:/tmp/a/script-0.1$ echo "script.sh usr/local/bin/" > debian/install

Здесь у вас есть реальный пример использования этого файла.

Вот и все! У вас есть все необходимое для создания пакета. cd в корневой каталог вашего пакета и запустите dpkg-buildpackage. Если все прошло хорошо, вы получите свой новый .deb в ../.

person rul    schedule 08.01.2014
comment
dh_usrlocal: debian/universal/usr/local/bin/chaudhary.sh is not a directory rmdir: failed to remove ‘debian/universal/usr/local/bin’: Directory not empty dh_usrlocal: rmdir debian/universal/usr/local/bin returned exit code 1 make: *** [binary] Error 1 Очевидно, вы не можете переместить файл в /usr/local/, можно создавать только каталоги. Но в любом случае большое спасибо чувак. Я изменил его на /usr/bin, и он отлично работает. Потрясающий :) - person Shubham Chaudhary; 09.01.2014
comment
О, ты прав. Пожалуйста, взгляните на команду dh_installdirs. - person rul; 09.01.2014
comment
На самом деле проблема здесь в том, что размещение файлов в каталоге /usr/local/ противоречит политике, и поэтому официальные инструменты (в данном случае dh_usrlocal) не работают. Чтобы переопределить поведение dh_usrlocal, просто добавьте новое правило в конец файла debian/rules под названием override_dh_usrlocal:. - person rul; 09.01.2014
comment
Только не устанавливайте в /usr/local. Он зарезервирован для локальных файлов, созданных системным администратором. - person Dominik George; 03.05.2017

Вам действительно следует просмотреть в этом порядке неофициальное руководство по упаковке, Руководство для новых сопровождающих Debian, Справочник разработчика Debian и Политика. (Порядок также становится все более сухим и обратным для формальности.)

Это может занять два дня или около того, но оно того стоит.

Кроме того, обратите внимание на другие небольшие пакеты, поставляющие только сценарии или другие простые «установщики файлов» (например, php -htmlpurifier, первый пример, который я вспомнил, когда писал это).

person mirabilos    schedule 07.01.2014
comment
Не знаю, почему за это проголосовали, это правильный подход. Например, чтобы в будущем не создавать пакет и /usr/local в одном предложении. - person Dominik George; 03.05.2017

Если в вашем пакете будет только один файл (или небольшое количество файлов), просмотр всей цепочки инструментов Debian может оказаться излишним.

Для упаковки отдельных файлов я рекомендую использовать инструмент equivs. Установите пакет equivs, затем запустите equivs-control, чтобы создать файл шаблона.

Отредактируйте файл шаблона (дайте вашему пакету имя, номер версии и т. д.).

Добавьте имя вашего скрипта в атрибут Files: в шаблоне, например:

Package: my-awesome-script
Version: 4.2
Files: my-awesome-script.sh /usr/local/bin
Section: misc
Priority: optional
Standards-Version: 3.9.2
Maintainer: Me <[email protected]>
Description: An awesome script doing stuff
 Lorem ipsum etc. pp.

Поместите файл сценария рядом с файлом шаблона.

Запустите equivs-build, который создаст ваш пакет Debian.

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

person Sigi    schedule 27.04.2014

Используйте checkinstall или fpm для создания пакетов за считанные минуты, а не часы или дни!:

sudo checkinstall --fstrans=yes --install=no -D --pkgname=script \
    --maintainer='Name <[email protected]>' --pkgarch=all --pkgversion=0.1 \
    --nodoc cp script.sh /usr/local/bin

fpm -s dir -t deb --prefix /usr/local/bin -n script -v 0.1 -a all ./script.sh

Примечание: для проверки установки требуется dpkg/dpkg-deb (работает только на Debian/Ubuntu), fpm не зависит от платформы, но требует ruby.

person Javier López    schedule 22.05.2015
comment
Может ли кто-нибудь, кто проголосовал за этот ответ, объяснить, почему? Спасибо. - person ; 14.01.2018
comment
Это хороший ответ, я тоже не понимаю, почему за него нужно проголосовать. - person Sigi; 05.04.2018
comment
Использование fpm (и, предположительно, checkinstall) коррелирует с созданием проблемного пакета (например, запустите lintian для пакета fpm, и вы увидите проблемы). Если вы планируете распространять пакеты для Debian/Ubuntu или их производных, использование правильной цепочки инструментов сэкономит время и усилия в долгосрочной перспективе. - person James Tocknell; 05.08.2018
comment
Это не мешает вам использовать fpm, если вам просто нужно что-то быстро развернуть, но пакет fpm не следует рассматривать как альтернативу правильно упакованному deb (или deb, в зависимости от обстоятельств). - person James Tocknell; 05.08.2018

для предварительной установки напишите свой скрипт в файле DEBAIN/preinst;

для пост-установки напишите свой скрипт в файле DEBAIN/postinst;

person Fang Cao    schedule 21.12.2020
comment
Не могли бы вы дать более подробную информацию о каждом пути и ссылку на документ? - person YLR; 21.12.2020
comment
Привет и добро пожаловать в SO! Прочтите обзор и Как сделать Я пишу хороший ответ? - person Tomer Shetah; 21.12.2020