如何仅在第一次安装包时运行脚本而不是在升级期间运行脚本?

如何仅在第一次安装包时运行脚本而不是在升级期间运行脚本?

我最近开始打包一些软件并将其发布到 Launchpad 上。安装和删除工作正常,但将软件包从一个版本升级到下一个版本时会出现问题。

问题是有些脚本只需要在第一次安装软件包时运行。这些脚本会填充数据库、创建用户等。它们当前在 package.postinstconfigure)部分中调用。然而,这会导致它们在升级过程中被调用,并且显示在图表

有没有办法将维护者脚本包含在 .deb 软件包中,该脚本仅在软件包首次安装时执行,而不是在升级期间执行?或者,在 .deb 软件包中包含一些初始设置脚本的优雅方法是什么?

答案1

看看这个图表Debian 维基关于如何调用维护者脚本: 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'

或者

为什么不简单地检查您想要做的更改是否已经存在,如果不存在则继续。

相关内容