2012-01-19 79 views
1

我有一个debian软件包,包含文件,控制文件和postinst文件的tar文件。它使用dpkg-deb构建,并使用dpkg正确安装。debian软件包内容的运行时安装目录

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

我的问题:

1)是否有可能来动态确定在运行安装目录?

2)如果可能的话我该怎么办呢?我已阅读有关规则文件和mypackage.install文件,但我不知道这些是否会允许我完成此操作。

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

在此先感谢!

+0

有一个选项可以传递给'dpkg'以使用不同于'/ usr'的根目录来安装。 'deb'软件包在这个意义上没有“安装目录” - 如果你添加了你现在拥有的东西和你想要的东西的例子,这将有所帮助。理论上你可以从你的'postinst'脚本中移动东西,但我会强烈劝阻你。 – tripleee

+0

好主意。我尝试使用--instdir =并且它复制了这些文件,但postinst将无法运行,因为--instdir执行chroot,因此您必须在那里还有dpkg admin目录。我也尝试使用--root和--admindir组合来查看是否可以拆分这两个目录。 rpm有一个重定位标志,所以你可以移动包的位置。我必须有一个动态目录,因为这个软件包必须位于两个不同嵌入式Linux发行版的不同位置。举一个例子,假设一个文件位于不同机器上不同位置的tarball中。 –

+0

我会简单地创建两个不同的'deb'包,除非文件是conffile。例子仍然有帮助。一个典型的软件包管理的文件可能类似于'/ usr/lib/yourpackage.so'和一个典型的confeile例如'的/ etc/yourpackage.cfg'。 – tripleee

回答

1

所以这就是我在过去几周发现的这个问题。

使用预打包的二进制文件,您无法生成运行时确定的目标目录dynamicall的debian软件包。我相信如果安装一个从源代码构建的软件包,您可以使用configure来设置安装目录,这可能是可能的。但在这种情况下,因为这些是嵌入式Ubuntu机器,他们没有制造,所以我没有追求这样的选择。我做了一个非传统的方法(黑客)来安装这个工作。由于debian软件包相对于/ tmp简单地包含一个相对于/简单地构建相对于目录的tar包。然后,在postinst脚本中,您可以确定将档案中的文件复制到永久位置的位置。

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

我发现的是,如果您尝试使用'dpkg -r myapp'删除软件包,dpkg会尝试删除/ tmp,这不是很好。不过/ tmp不容易删除,所以它从来没有成功。另外在我们的情况下,我们永远不会删除软件包,而只需升级它

我最终不得不放弃通用程序包,因为源代码中的代码差异导致不得不为每个平台重新编译,但是我会以这种方式离开它,它确实有效。

我尝试使用--instdir来更改软件包的安装目录,但它确实重新定位了这些文件,但dpkg失败,因为无法找到与新​​instdir相关的dpkg文件。使用--instdir有点像chroot。我也尝试过--admindir和 - 根据各种组合来查看是否可以使用dpkg系统相对于/但安装重定位文件,但他们没有工作。我想rpm有一个重定位选项,但不是Ubuntu。

0

您还可以编写一个脚本,该脚本运行6次不同环境的dpkg-deb,生成6个不同的包。当您进行修改时,您只需运行脚本,即可生成所有6个软件包,并且可以将它们安装到您的机器上,避免后期黑客入侵!

0

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

相关问题