在preinst Debian维护脚本中获取新版本

在preinst Debian维护脚本中获取新版本,debian,packages,Debian,Packages,我想防止旧的Debian软件包在新安装的Debian软件包上践踏 我试图通过比较当前的Debian包版本和Debian/preinst维护脚本中当前安装的版本来实现这一点。理想情况下,我希望提供一个警告和(是否继续?)提示 这个问题与我们的工作密切相关。这个问题是在09年产生的,所以我不确定在这个问题中添加我的问题是否合适 对老问题的回答是:“为什么不能简单地在包中硬编码版本?” 我的回答是,我不想在另一个地方管理这个版本。该版本已经在debian/changelog和Python模块的init

我想防止旧的Debian软件包在新安装的Debian软件包上践踏

我试图通过比较当前的Debian包版本和Debian/preinst维护脚本中当前安装的版本来实现这一点。理想情况下,我希望提供一个警告和(是否继续?)提示

这个问题与我们的工作密切相关。这个问题是在09年产生的,所以我不确定在这个问题中添加我的问题是否合适

对老问题的回答是:“为什么不能简单地在包中硬编码版本?”

我的回答是,我不想在另一个地方管理这个版本。该版本已经在debian/changelog和Python模块的init.py脚本中,作为version。这个逻辑还需要复制到我们正在维护的其他几个内部Debian包中。理想情况下,我希望通过从构建Debian包的过程中删除步骤来尽可能地简化这一过程

我已经阅读了相关的Debian文档,虽然我可以获得旧版本,但无法获得我当前安装的版本

我在debian/preinst中回显了env,它确实提供了一个包含以下版本的环境变量…:SUDO_COMMAND=/usr/bin/dpkg-I python-mypkg_1.9.3-2_all.deb。我应该能够以这种方式获得版本,但我不确定是否可以依赖此变量在部署此包的每个发行版中存在。这样做似乎也是一种恶作剧

我知道dpkg parsechangelog,这是一个很棒的工具!,但它只有在打开包装后才能工作。文件中也明确说明了这一点

我还尝试使用Python pckg_resources模块来发现版本:pckg_resources.require(“mypkg”)[0]。版本。如果模块尚未安装在目标机器上,它将失败——这是绝对有意义的


似乎debian/control文件中应该有一个选项,或者我可以使用一些工具来防止这种情况发生,而无需重新发明轮子。谢谢大家

我将使用SUDO_命令。这至少可以使我不必将版本硬编码到preinst维护脚本中(它已经存在于另外两个位置!!)。这是一个极端的黑客行为,但我还没有找到任何有用的文档,可以指导我采取更明智的方法

仅供参考,env变量SUDO_COMMAND似乎存在于我使用过的每个Debian环境中。

试试:

dpkg-query --show --showformat='${Version}' packagename

在debian上降级软件包只有在用户手动强制或设置了apt钉住强制的情况下才有可能。我不明白如果你只是想让用户“确认”这样做,为什么你还要这么做,因为他们已经“确认”了他们想这么做。问题是,我们的内部流程指定了一个sysad来安装特定版本的Debian软件包w/dpkg-I我们的_package.version.deb。我们没有一个合适的来源可以阻止这类事情的发生。用例是:如果同一个包有两个不同版本的开放票证,并且Debian安装程序的“旧”更改在更高版本后被推送,那么它将践踏新的更改。这应该应用到sysad过程中。然而,事实并非如此,因此需要一个故障保护来确保他们不会做出他们不想做的更改。奇怪的是,新版本并没有作为MaintainerScript的参数存在。。。