我的包裹有问题apt
,我已经解决了。这里讨论问题和解决方案:
Aptitude 说我的很多软件包需要删除......?
然而,在讨论这个问题时,我意识到我有一个辅助问题,apt
我想找到答案,这就是我发布这个当前问题的原因。
我不小心做了一些事情,导致超过 1,400 个“自动”软件包成为孤立的,它们被列为“不再使用”,并在aptitude
.现在看来,造成这种情况的原因是因为它们最终都依赖于某个被错误删除的基础级包或元包。
如果是这种情况,是否有一个实用程序或过程可以用来将apt
包列表作为输入,并为整个包集(作为一个整体)生成依赖关系树?如果是这样,我可能能够识别出我不小心删除的这棵树顶部的软件包,然后我可以重新安装该软件包以解决我的问题。
换句话说,我正在寻找一些过程或实用程序,它会将包列表作为输入并生成与此类似的内容作为输出......
top-package
|--package-000
|-+package-001
| |--package-002
|-+package-003
| |--package-004
| |--package-005
| |-+package-006
| | |--package-007
| |--package-008
|--package-009
... etc. ...
...package-NNN
我的输入包列表以及它们恰好是依赖项的任何其他包在哪里,并且top-package
是依赖项树的根。如果我的假设是正确的,即我的问题是由于意外删除了高级元包所致,那么top-package
将识别该已删除的包。然后我可以重新安装top-package
并大概解决我的问题。
需要明确的是,我想重复一下,我已经以不同的方式解决了我的具体问题(请参阅引用的讨论)。我在这里问这个不是为了解决这个特定问题,而是因为我想要某种像上面描述的依赖树列表工具,以帮助诊断和修复可能发生在未来。
非常感谢您提供任何参考或建议。
答案1
您可以使用 :
apt depends <package>
apt-cache depends <package>
或者债务树:
sudo apt install debtree
debtree <package>
为指定的包生成依赖关系图(以“点”语法)...
默认情况下,依赖关系图将显示(预)依赖关系、推荐的包、未版本化的冲突以及请求的包提供的虚拟包。或者,还可以包括建议的包和版本冲突。
将包列表放入文件中,然后:
cat file |xargs -n 1 apt-cache depends
cat file |xargs -n 1 debtree
答案2
我尝试了上面的建议,但它没有给我我想要的东西。我做了以下事情:
我将 1,400 多个包名称的列表放入名为 的文件中no-longer-in-use.txt
,每行一个包名称。
然后,我运行了这个命令:
% xargs -n 1 debtree <no-longer-in-use.txt | dot -Tjpg >depgraph.jpg
它运行了 2 或 3 小时,生成的depgraph.jpg
文件占用了超过 3.4Gb 的磁盘空间。
当我尝试查看此文件时,我看到的只是一张由 4 项组成的小图表。我猜测该命令最终生成了 1,400 多个单独的图表,然后简单地将它们一个接一个地附加到输出中。这意味着我的图像查看器只看到了第一个。
无论如何,我希望它们合并成一个单一的图表,而不是多个单独的图表。我认为为了实现这一目标,debtree
(或apt-cache depends
就此而言)的输出必须被预处理为表示所有单个包依赖项统一为一个包含依赖项树的东西。
和那是可以通过的东西来喂养的dot
。
但这仍然可能最终成为一个巨大的图像文件,而且我不需要那种视图。
我将尝试以下方法,而不是采用这种方法:
针对每个包运行apt-cache depends
,并使用包名称和每行中的数据将输出格式化为 CSV 文件,Depends:
如下所示。例如,使用ftp
包:
apt-cache depends ftp
输出:
ftp
Depends: libc6
Depends: libreadline8
Depends: netbase
Replaces: <netstd>
处理后的 CSV 输出:
ftp,libc6
ftp,libreadline8
ftp,netbase
对所有 1,400 多个包执行此操作,然后将它们各自的 CSV 输出连接到一个大 CSV 文件中
然后,使用这个大的 CSV 文件作为程序的输入,该程序从中生成依赖关系树。实际上,这可能会产生多棵树。每棵树的根都是我感兴趣的值。
在接下来的几天里,我将在业余时间研究这个程序,一旦完成我就会发布它。