如何在fakeroot deb包构建器中使用postinst脚本

时间:2014-09-16 23:09:49

标签: linux package debian deb dpkg

下午好,

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

fakeroot dpkg-deb --build mypackage

接下来,我可以使用

安装软件包
dpkg -i mypackage.deb

执行此操作时,所有内容都已正确安装和复制,但是我希望在安装软件包后运行一些bash命令。

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

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

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

  2. postinst脚本中有一个案例结构,这个是什么,以及我在哪里放置bash命令以在该脚本中执行

  3. 如果我使用 dpkg安装软件包 - 我的mypackage.deb 是否足以运行该脚本?

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

    1. " 配置,中止升级,中止删除和中止取消配置"代表。

    2. " 更新替代品" line do。

    3. 感谢您的帮助,

      下面的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
      

2 个答案:

答案 0 :(得分:3)

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

其次,在编写或处理维护者脚本时要记住的非常重要的事情必须是幂等的。假设脚本将连续多次运行,并确保在这种情况下仍然不会中断。

直接回答您的问题,

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

  2. 可以在许多不同的情况下调用postinst脚本。 "案例"您可以在许多(大多数?)帖子中找到的声明是为了检查它是哪种情况。一般来说,在所有可能的情况下采取大多数postinst操作是有意义的,这就是为什么它们在一个脚本中组合在一起的原因。但有时候区分更好。我将在#4下解释不同的情景。

  3. 是。成功安装deb软件包(无论是dpkg -iapt-get install还是其他)必须成功运行其preinst和postinst脚本(如果存在)。有可能解开"解包"没有运行任何维护者脚本的deb,但不考虑"安装"。

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

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

    • abort-upgrade :升级操作已中止。举个例子,我安装了mypkg版本V1,我尝试将其升级到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. "更新替代品"命令更新Debian"替代品中的条目"系统。 See the man page.在这种特定情况下,该命令告诉Debian" /usr/bin/fakeroot-ng"是fakeroot命令的替代方法。根据此备选方案的优先级和其他已注册备选方案的优先级以及用户的偏好,当有人运行" fakeroot-ng"时,可能会调用fakeroot

答案 1 :(得分:1)

只需考虑一下这一行:

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

并在你的后台脚本中:

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