这就是我在过去几周内发现的有关此问题的信息。
使用预打包的二进制文件,您无法构建一个目标目录在运行时动态确定的 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。