Недавно я начал собирать часть своего программного обеспечения и публиковать его на Launchpad. Установка и удаление работают нормально, но обновление пакета с одной версии до следующей версии проблематично.
Проблема в том, что есть некоторые сценарии, которые нужно запускать только во время первой установки пакета. Эти сценарии заполняют БД, создают пользователя и т. Д. В настоящее время они называются в разделе package.postinst configure)
. Однако это приводит к тому, что их вызывают во время обновления, а также показано в на диаграмме .
Есть ли способ включить сценарий сопровождающего в пакет .deb, который выполняется только во время первой установки пакета, а не во время обновления? Или как можно было бы элегантно включить некоторые сценарии начальной установки в пакет .deb?
С файлом debian/preinst
вы можете выполнять действия при установке, но не обновлять.
#!/bin/sh
set -e
case "$1" in
install)
# do some magic
;;
upgrade|abort-upgrade)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
#DEBHELPER#
exit 0
Хотя, как следует из названия, он запускается до установки вашего пакета. Таким образом, вы не сможете делать то, что вам нужно здесь. Большинство пакетов просто проверяют на этапе настройки postinst
, был ли пользователь уже создан. Вот colord
$ cat /var/lib/dpkg/info/colord.postinst
#!/bin/sh
set -e
case "$1" in
configure)
# create colord group if it isn't already there
if ! getent group colord >/dev/null; then
addgroup --quiet --system colord
fi
# create the scanner group if it isn't already there
if ! getent group scanner >/dev/null; then
addgroup --quiet --system scanner
fi
# create colord user if it isn't already there
if ! getent passwd colord >/dev/null; then
adduser --system --ingroup colord --home /var/lib/colord colord \
--gecos "colord colour management daemon"
# Add colord user to scanner group
adduser --quiet colord scanner
fi
# ensure /var/lib/colord has appropriate permissions
chown -R colord:colord /var/lib/colord
;;
esac
exit 0
Я обнаружил, что тестирование на $ 2 в вашем скрипте «postinst configure» не работает должным образом, если вы уже установили пакет один раз, затем удалили его (но без очистки), а затем попробуйте переустановить снова. В этом случае сценарий postinst по-прежнему получает аргумент версии для шага «postinst configure».
Однако, если вы установили пакет ранее, затем удалите И очистите его, а затем переустановите заново, сценарий «postinst configure» НЕ получит аргумент версии в $ 2
Вы можете использовать скрипт debian / preinst в сочетании с postinst.
В скрипте preinst проверьте наличие файла, который определенно установит ваш pkg. Если он присутствует, ничего не делайте (поскольку ваш пакет был ранее установлен), в противном случае выполните шаги по настройке.
Если ваши шаги по установке требуют, чтобы ваш pkg был установлен (в этом случае вышеописанное не будет работать, поскольку preinst запускается перед установкой), тогда ваш скрипт preinst может записать файл, например: / tmp / setupmypkg. Ваш скрипт postinst может просто проверить, присутствует ли этот файл, и если это так, сделать две вещи:
Я так не думаю, но вы можете легко изменить сценарии preinst / postinst, чтобы проверить, устанавливается ли пакет впервые, и предпринять стандартные действия.
Может быть что-то вроде этого,
в preinst.
if not is_package_istalled():
export MY_PACKAGE_FIRST_INSTALL
в postinst,
if MY_PACKAGE_FIRST_INSTALL:
Do First Install Setup
Редактировать
Хм, может быть, вы можете просто проверить все это непосредственно в postinst, потому что я думаю, что dpkg не будет установить статус пакета как установленный перед запуском postinst, но я не уверен. Таким образом, вышесказанное может прийти,
в postinst,
if not is_package_istalled():
Do First Install Setup
Где is_package_installed может быть вашей функцией для определения состояния установки. Может быть что-то вроде 'dpkg --status packagename'
ИЛИ
Почему бы просто не проверить, внесены ли изменения, которые вы хотите внести, и продолжить, только если их нет.
Посмотрите на эту диаграмму из вики Debian о том, как называются сценарии сопровождающего:
Если следовать левой стороне ( ok ”) вы увидите, что скрипт postinst
вызывается с последней настроенной версией. Это дает вам возможность отличить обновление от новой установки - в случае обновления ваш postinst будет называться как
postinst configure 1.23-0ubuntu1
где 1.23-0ubuntu1
- ранее установленная версия вашего пакета, тогда как для новая установка будет называться как
postinst configure
Это также позволяет вам обрабатывать случай, когда вам нужно выполнить действие при обновлении с определенной версии - вы можете проверить в postinst
для этой версии .
Это позволяет легко проверить, выполняется ли сценарий при «установке» или «обновлении». Если $ 2 ноль, то это установка. итак:
if [ -z "$2" ]; then
do install stuff
else
do upgrade stuff
fi