我最近开始打包一些软件并将其发布到 Launchpad 上。安装和删除工作正常,但将软件包从一个版本升级到下一个版本时会出现问题。
问题是有些脚本只需要在第一次安装软件包时运行。这些脚本会填充数据库、创建用户等。它们当前在 package.postinstconfigure)
部分中调用。然而,这会导致它们在升级过程中被调用,并且显示在图表。
有没有办法将维护者脚本包含在 .deb 软件包中,该脚本仅在软件包首次安装时执行,而不是在升级期间执行?或者,在 .deb 软件包中包含一些初始设置脚本的优雅方法是什么?
答案1
看看这个图表Debian 维基关于如何调用维护者脚本:
如果您顺着左侧(“一切正常”路径)往下走,您会看到该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
答案2
使用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
答案3
您可能能够将 debian/preinst 脚本与 postinst 结合使用。
在 preinst 脚本中,检查 pkg 肯定会安装的文件。如果存在,则不执行任何操作(因为您的软件包之前已安装),否则,执行设置步骤。
如果您的安装步骤要求安装 pkg(在这种情况下,上述操作将不起作用,因为 preinst 在安装之前运行),那么您的 preinst 脚本可以写入一个文件,例如:/tmp/setupmypkg。您的 postinst 脚本可以简单地测试该文件是否存在,如果存在,则执行以下两项操作:
- 您的初始设置步骤
- 删除 /tmp/setupmypkg 文件
答案4
我不这么认为,但您可以轻松修改 preinst/postinst 脚本来检查包是否是第一次安装并采取标准操作。
可能是这样的,
在预先。
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'
或者
为什么不简单地检查您想要做的更改是否已经存在,如果不存在则继续。