Есть ли способ автоматически определять зависимости при настройке файла управления dpkg?
большинство полей в файле управления dpkg (Debian) являются простыми. Сложнее всего определить список зависимостей (Depends:). Я надеялся, что dpkg-gencontrol может сделать это для меня, посмотрев на вывод ldd для исполняемых файлов в каталоге пакетов. Возможно, но я не могу заставить его работать.
если это dpkg-gencontrol
для, ошибка, которую я получаю:
dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field.
Для справки, команда dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian
. В control_template файл содержит это:
Package: my-package
Maintainer: Joe Coder <joe@coder.com>
Description: The my-package system
A longer description that runs to the end of one line and then
extends to another line.
Priority: optional
если это не то, что dpkg-gencontrol
для, Есть ли у кого-нибудь предложения о том, что я могу сделать, или советы о том, как настроить список зависимостей, в идеале автоматически?
по общему признанию, вывод зависимостей в общем виде, вероятно, очень сложная проблема, особенно если вы расширяете поиск на скрипты и другие программы. Я надеюсь, что существуют некоторые инструменты, которые работают большую часть времени.
обратите внимание, что это для внутреннего только распространение. Я не создаю пакет для входа в дистрибутив Linux или даже для загрузки широкой публикой, поэтому я рад согнуть/нарушить стандартные правила, если это необходимо.
2 ответов
после некоторого копания, вдохновленного ответом Титона, и много проб и ошибок, я, наконец, нашел решение своей проблемы. Оказывается, dpkg-gencontrol не является инструментом для вывода зависимостей пакетов из исполняемых файлов, dpkg-shlibdeps. Тем не менее, вещи должны быть настроены тщательно для двух программ, чтобы помочь создать пакет. Читайте дальше....
под управлением dpkg-shlibdeps -O <executable>
результаты в списке пакетов и версий, которые должны быть установлены для запуска этого исполняемого файла. Идеальный. Почти. В идеале dpkg-gencontrol может использовать это в своей обработке, что он утверждает, что может сделать через свою функцию подстановки переменных.
чтобы все прошло гладко, мне пришлось создать структуру каталогов, которая соответствует ожиданиям инструментов упаковки Debian. Это выглядит в основном так:
my_project_directory/
main.c (or other source code, etc.)
debian/
changelog (created by hand; see below)
control (this is basically a template, created by hand; see below)
files (created by dpkg-gencontrol)
substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol)
tmp/ (tmp is the root of the target system's filesystem)
path/
to/
my/
project/
executable_1 (this will be installed at /path/to/my/project)
executable_2 (this, too)
var/
www/
index.php (this will be installed at /var/www on target systems)
DEBIAN/ (create this by hand)
control (created by dpkg-gencontrol and used in the final package)
обратите внимание, что инструменты упаковки Debian сохраняют владельца и группу всех файлов в debian/tmp/. Таким образом, если вы хотите, чтобы файлы принадлежали root или другим пользователь при установке, вещи получить сложно. Один из вариантов-подготовить дерево каталогов debian как root и установить владельцев, как вам нравится. Если вы предпочитаете не работать как root или не разрешены, есть другой способ.
создайте скрипт, который вызывает chown и т. д. чтобы настроить ownerships, как вам нравится, с последней строкой dpkg-deb -b debian/tmp .
(которая строит .deb пакет, ниже пример). Запустите его через fakeroot, другой инструмент Debian, например:fakeroot ./fix_ownerships_and_build.sh
. Fakeroot позволяет программам вести себя так, как будто они были root, фактически не меняя вещи, как это сделал бы root. Он был создан именно для этого сценария.
Я посмотрел, почему dpkg-gencontrol генерирует ошибку "первый блок не имеет исходного поля", даже до чтения его источника Perl. Как это часто бывает, код ошибки точен, не предоставляя достаточного контекста, чтобы знать, что делать: файлу управления действительно нужно поле под названием "источник" в его первом (из двух) блоков.
существует два вида Debian пакеты, исходные и двоичные. Я думал, что мне нужен двоичный, так как я просто хочу поместить в него скомпилированные исполняемые файлы, но я не мог заставить это работать. Я попробовал исходный пакет и добавил исходное поле в свой файл управления. Это избавило от ошибки" первый блок не имеет исходного поля", но привело к другому. Читая документацию более внимательно, я понял, что исходные пакеты нужны два "абзаца" в файлах управления. Как только я изменил свой файл управления, чтобы выглядеть так, он начался на работу (почти):
Source: my-package
Maintainer: Joe Coder <joe@coder.com>
Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends}, apache2, php5
Description: The My-Package System
A longer description that runs to the end of one line and then
extends to another line.
еще не было в файле changelog. Это файл для хранения истории выпусков пакета со значительными изменениями, номерами версий, датами и ответственными лицами. Я обычно поддерживаю такую вещь в своем собственном формате, который я тщательно преобразовал в требовательный формат журнала изменений Debian. По какой-то причине журнал изменений был опущен из окончательного пакета, поэтому я оставил свой файл истории в покое и использовал вместо него заполнитель, который выглядит так это:
my-package (1.0) unstable; urgency=low
* placeholder changelog to satisfy dpkg-gencontrol
-- Joe Coder <joe@coder.com> Thu, 3 Nov 2011 16:49:00 -0700
два ведущих пространства на линии с * необходимы, как и одно ведущее пространство на линии с--, как и два пространства между адресом электронной почты и датой. И да, дата должна быть точной, часовой пояс и все такое, хотя это не обязательно должно быть точным.
собирая все вместе, с деревом каталогов debian, настроенным, как описано выше, последовательность команд, необходимых для создания пакета, такова следует:
dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1 (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh
где fix_ownerships_and_build.sh выглядит так:
chown -R root:root debian/tmp/path (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/* (same goes here)
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file)
так вот оно что. Надеюсь, этот ответ поможет другим быстрее, чем я.
На самом деле, просмотр списка включенных библиотек довольно распространен для программ на C и просто работа помощника shlibs (dpkg-shlibdeps
). Посмотрите на его manpage за помощью, но в основном это сводится к использованию ${shlibs:Depends}
в вашей строке depends.