1

我有一个我构建的 debian 包,其中包含文件的 tar 球、控制文件和 postinst 文件。它使用 dpkg-deb 构建,并使用 dpkg 正确安装。

我想做的修改是在运行时根据将在 deb 文件上运行 dpkg -i 时设置的环境变量来确定文件的安装目录。我在 postinst 脚本中回显环境变量,我可以看到它的设置正确。

我的问题:

1)是否可以在运行时动态确定安装目录?

2)如果可能的话,我会怎么做?我已阅读有关规则文件和 mypackage.install 文件的信息,但我不知道其中任何一个是否允许我完成此操作。

我可以通过将文件复制到 posinst 脚本中的目标位置来破解它,但如果可能的话,我更愿意以正确的方式进行操作。

提前致谢!

4

3 回答 3

2

这就是我在过去几周内发现的有关此问题的信息。

使用预打包的二进制文件,您无法构建一个目标目录在运行时动态确定的 debian 包。我相信如果安装从源代码构建的软件包,您可以使用 configure 设置安装目录,这可能是可能的。但在这种情况下,因为这些是嵌入式 Ubuntu 机器,他们没有制造,所以我没有追求这样的选择。我确实制定了一种非传统的安装方法(hack),它确实有效。由于 debian 包只包含一个相对于 / 的 tar 球,因此只需相对于 /tmp 下的目录构建你的包。在 postinst 脚本中,您可以确定将文件从存档复制到永久位置的位置。

我预计在重新启动并自动删除 /tmp 下的子目录后,dpkg 可能不知道该文件包存在。这不是问题。当我运行“dpkg -l myapp”时,它显示为仍然安装。使用 dpkg/apt-get 更新软件包也很顺利。

我确实发现,如果您尝试使用 'dpkg -r myapp' 删除软件包,dpkg 会尝试删除不好的 /tmp。但是 /tmp 不容易删除,因此它从未成功。另外,在我们的情况下,我们从不删除软件包,而是简单地升级它们。

由于源代码中的代码差异,我最终不得不放弃通用包,导致必须在每个平台上重新编译,但我会以这种方式离开它并且它确实有效。

我尝试使用 --instdir 更改软件包的安装目录,它确实重新定位了文件,但 dpkg 失败,因为相对于新的 instdir 找不到 dpkg 文件。使用 --instdir 有点像 chroot。我还尝试了 --admindir 和 --root 的各种组合,看看我是否可以使用相对于 / 的 dpkg 系统,但安装重定位文件但它们不起作用。我猜 rpm 有一个重定位选项,但不是 Ubuntu。

于 2012-01-28T00:01:54.027 回答
0

你也可以编写一个脚本,在不同的环境下运行 dpkg-deb 6 次,生成 6 个不同的包。当你进行修改时,你只需要运行你的脚本,所有 6 个包都会生成,你可以将它们安装在你的机器上,避免 postinst 黑客攻击!

于 2013-05-09T17:28:34.727 回答
0

为什么不安装到标准位置,而只需使用 postinst 脚本创建指向所需位置的符号链接?这更干净,不应该破坏 dpk -I 中的任何内容。

于 2016-04-25T16:06:30.027 回答