【问题标题】:How would I use postinst script with fakeroot deb package builder我如何将 postinst 脚本与 fakeroot deb 包生成器一起使用
【发布时间】:2014-11-10 20:29:12
【问题描述】:

下午好,

我能够使用以下方法将我的项目构建到一个 deb 包中:

fakeroot dpkg-deb --build mypackage

接下来,我可以使用安装包

dpkg -i mypackage.deb

当我这样做时,一切都已正确安装和复制,但是我想在安装包后运行一些 bash 命令。

我知道这需要使用 mypackage/DEBIAN 目录中的 postinst 文件来完成

我在网上看到过这个脚本的一些示例,但没有明确说明如何编写以及如何将其包含在构建中。

  1. 如何确保 fakeroot dpkg-deb 包含此脚本,将其放入 DEBIAN 目录是否足够?

  2. postinst 脚本中有一个 case 结构,这是做什么用的,我应该在哪里放置要在该脚本中执行的 bash 命令

  3. 如果我使用 dpkg - i mypackage.deb 安装软件包,这足以运行该脚本吗?

我想制作的示例脚本如下所示。

  1. configure、abort-upgrade、abort-remove 和 abort-deconfigure”代表什么。

  2. update-alternatives”行有什么作用。

感谢您的帮助,

postinst 文件如下。

#!/bin/sh

set -e

case "$1" in
    configure)
        # EXECUTE MY BASH COMMAND
        echo /usr/local/lib > /etc/ld.so.conf && ldconfig
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
        exit 0
    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

update-alternatives --install /usr/bin/fakeroot fakeroot /usr/bin/fakeroot-ng 5 \
        --slave /usr/share/man/man1/fakeroot.1.gz \
            fakeroot.1.gz /usr/share/man/man1/fakeroot-ng.1.gz

exit 0

【问题讨论】:

  • 你试过用 dpkg-buildpackage 代替 dpkg-deb 吗?

标签: linux package debian deb dpkg


【解决方案1】:

首先,这里可能是最相关的文档:Debian Policy Manual: Package Maintainer Scripts and Installation Procedure

其次,在编写或处理维护者脚本时要记住的最重要的一点是它们必须是幂等的。假设脚本将连续运行多次,并确保即使如此,事情仍然不会中断。

直接回答您的问题,

  1. 在使用dpkg-deb 构建时,将其放在DEBIAN 目录中是正确的。如果您改用 Debhelper 进行更安全或更方便的构建设置,则可以将 postinst 放在 debian/$packagename.postinst

  2. 可以在多种不同情况下调用 postinst 脚本。您可以在许多(大多数?)postinsts 中找到的“case”语句旨在检查它是哪种情况。一般来说,在所有可能的情况下采取大多数 postinst 操作是有意义的,这就是为什么将它们组合在一个脚本中的原因。但有时最好区分一下。我将在 #4 下解释不同的场景。

  3. 是的。成功安装 deb 包(无论是通过dpkg -iapt-get install 还是其他方式)必须包括成功运行其 preinst 和 postinst 脚本(如果存在)。可以在不运行任何维护者脚本的情况下“解压”deb,但这不被视为“安装”。

  4. 这些“动作”名称对应于可以运行 postinst 的不同情况。

    • 配置:正在安装或升级软件包。如果之前没有安装包,$2 将为空。否则$2 将包含包的旧版本号;您要升级的版本。

    • abort-upgrade:升级操作被中止。例如,我安装了 V1 版本的 mypkg,并尝试将其升级到 V2。但是V1的preinst或者postinst运行失败,或者文件冲突。 dpkg 停止尝试安装 V2,并从 V1 重新运行 postinst(使用“abort-upgrade”操作)以防需要恢复任何状态。

    • abort-remove:删除操作已中止。例如,如果我运行“dpkg -P mypkg”,但 mypkg 的 prerm 脚本未能运行,或者发生了其他事情,使 dpkg 认为它无法安全地卸载 mypkg。因此它会再次运行 mypkg 的 postinst(使用“abort-remove”操作)以防需要恢复任何状态。

    • abort-deconfigure:如您所料,取消配置操作已中止。 “取消配置”是一种半删除操作,当正在安装的软件包与已安装的其他软件包发生冲突时使用。简而言之,如果正在运行 abort-deconfigure 操作,则 postinst 应恢复任何可能已被 prerm 脚本使用 deconfigure 操作撤消的状态。

    如需更多细节,请参阅https://people.debian.org/~srivasta/MaintainerScripts.html 上的精彩图表和说明。

  5. “update-alternatives”命令更新 Debian“alternatives”系统中的条目。 See the man page. 在这种特定情况下,该命令告诉 Debian “/usr/bin/fakeroot-ng”是fakeroot 命令的替代品。根据此替代方案的优先级和其他已注册替代方案的优先级以及用户的偏好,当有人运行“fakeroot”时,现在可能会调用fakeroot-ng

【讨论】:

  • 所以我们必须把它放到DEBIAN目录但是名字很重要,我们在哪里告诉dpkg文件的名字呢?我正在使用 dpkg-buildpackage,这有什么不同吗?
  • 如果您将 postinst 直接放入 DEBIAN 目录,则文件名必须准确为 postinst。更常见的是,人们使用 Debhelper 而不是直接将东西放入 DEBIAN。如果您这样做,则将其命名为 debian/postinstdebian/$packagename.postinst
【解决方案2】:

只要想想这一行:

echo /usr/local/lib > /etc/ld.so.conf && ldconfig

根据 Debian 政策,you shouldn't modify ld.so.conf

一个简单的选择是做这样的事情:

在您的 postinst 脚本中:

/usr/local/lib > /etc/ld.so.conf.d/EXAMPLE.conf && ldconfig

在您的 postrm 脚本中:

rm /etc/ld.so.conf.d/EXAMPLE.conf && ldconfig

【讨论】:

  • 虽然这很有用、正确且相关,但它并不能回答问题。
  • 我知道,但它可以帮助别人不要犯这个错误。但我完全同意你的看法。
  • 你是救生员!刚刚偶然发现这个问题! :)
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2019-05-15
  • 2018-10-27
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多