如何使dpkg在已安装的虚拟包上自动选择我自己的虚拟包?

时间:2014-04-17 08:32:28

标签: bash dpkg

我有几个提供相同功能的软件包 - 并且在设备中 '同时只能有一个'。

我已经阅读了debian策略中的“提供,冲突,替换”,但我没有找到一种方法(使用带命令/开关的dpkg)自动替换已安装的虚拟包而不先手动删除它。 / p>

我的包的控制文件为所有相关包指定了以下内容:

Provides: myown-virtual-package
Conflicts: myown-virtual-package
Replaces: myown-virtual-package

这是我的工作,它似乎有效,但我想知道是否有一种仅使用dpkg的标准方法

# remove any conflicting virtual packages
for i in /tmp/upgrade_software/*.deb
do
    # find out what package name and what it provides
    provides_line=$(dpkg --info $i | grep "^ Provides: ")
    package_line=$(dpkg --info $i | grep "^ Package: ")
    virt_package=${provides_line##*: }
    this_package=${package_line##*: }

    # skip if it is not a virtual package 
    [ -z "${virt_package}" ] && continue


    # remove any package that provides the same
    otherpackage_line=$(dpkg-query -W -f='${Provides}: ${Package}\n' \
        | grep "${virt_package}:" | grep -v ${this_package})
    if [ -n "${otherpackage_line}" ] ; then
        otherpackage=${otherpackage_line##*: }
        echo "    ------ removing ${otherpackage} because of conflict -------"
        dpkg --purge ${otherpackage}
        echo "    -------------"
    fi
    echo \'$virt_package\' checked for conflicts
done

提前致谢,jj

2 个答案:

答案 0 :(得分:1)

dpkg不会采取这种自动冲突解决措施。对于这些任务,有apt-getaptitude可能只能与

一起使用
dpkg -i package.deb ; apt-get -f install

后一个命令应该解决冲突。如果它选择删除您自己的包以进行解析,您甚至可以尝试

dpkg -i package.deb ; apt-get -f install <package>

即告诉apt安装您的软件包(没有.deb扩展名),因为它现在应该对apt可见。

答案 1 :(得分:0)

这可以单独使用dpkg,通过提供足够的信息以便它可以执行操作。为此准备dpkg的方法是通过选择。

在这种情况下,您可以告诉您删除旧的提供程序是正常的,然后当您安装新的提供程序时,dpkg将能够在升级期间删除其他程序包。

尝试类似:

echo old-provider deinstall | dpkg --set-selections
dpkg -iB new-provider.deb

原则上应该这样做,并且不需要apt-get修复它(-f),或者用于预清除(如果存在依赖于虚拟的软件包,可能使用--force选项)。