如何仅在首次安装软件包而不是在升级期间运行脚本?

Jer*_*oen 18 package-management packaging apt dpkg

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

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

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

RAO*_*AOF 33

查看Debian wiki 中有关如何调用维护者脚本的图表: Debian 维护者脚本流程图

如果您按照左侧(“一切顺利”的路径)进行操作,您将看到postinst使用最新配置的版本调用该脚本。这使您有机会区分升级和全新安装 - 在升级情况下,您的 postinst 将被称为

postinst configure 1.23-0ubuntu1
Run Code Online (Sandbox Code Playgroud)

1.23-0ubuntu1先前安装的软件包版本在哪里,而对于全新安装,它将被称为

postinst configure
Run Code Online (Sandbox Code Playgroud)

这还允许您处理从特定版本升级时需要执行操作的情况 - 您可以签入该postinst版本的 。

这样可以轻松检查脚本是在“安装”还是“升级”时完成的。如果 $2 为空,则为安装。所以:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您已删除软件包(但未清除它)并再次安装它,也会传递额外参数。 (2认同)

and*_*ing 15

使用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
Run Code Online (Sandbox Code Playgroud)

尽管顾名思义,这是在安装包之前运行的。因此,您可能无法在此处执行所需的操作。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
Run Code Online (Sandbox Code Playgroud)