我有几个提供相同功能的软件包 - 并且在设备中 '同时只能有一个'。
我已经阅读了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
答案 0 :(得分:1)
dpkg
不会采取这种自动冲突解决措施。对于这些任务,有apt-get
和aptitude
。 可能只能与
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选项)。