我有一个我构建的debian包,其中包含文件的tar球,控制文件和postinst文件。它使用dpkg-deb构建,并使用dpkg正确安装。
我想做的修改是在运行时根据在deb文件上运行dpkg -i时设置的环境变量确定文件的安装目录。我在postinst脚本中回显了环境变量,我可以看到它的设置正确。
我的问题:
1)是否可以在运行时动态确定安装目录?
2)如果可能的话我该如何解决这个问题?我已经阅读了有关规则文件和mypackage.install文件但我不知道其中任何一个是否允许我完成此操作。
我可以通过将文件复制到posinst脚本中的目标位置来破解它,但如果可能的话,我希望以正确的方式执行此操作。
提前致谢!
答案 0 :(得分:1)
所以这就是我在过去几周内发现的这个问题。
使用预先打包的二进制文件,您无法构建一个debian包,其中包含在运行时确定的目标目录dynamicall。我相信如果安装从源构建的包,您可以使用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。
答案 1 :(得分:0)
您还可以编写一个脚本,使用不同的环境运行dpkg-deb 6次,生成6个不同的包。当你进行修改时,你只需要运行你的脚本,并生成所有6个包,你可以在你的机器上安装它们,避免后期黑客攻击!
答案 2 :(得分:0)
为什么不安装到标准位置,只需使用postinst脚本创建指向所需位置的符号链接?这个更干净,不应该在dpk -I中破坏任何东西。