Ubuntu 用户(或其他使用 apt 包管理工具的发行版)遇到以下错误并不罕见:
user@box ~ $ sudo apt install x
[sudo] password for user:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package x is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'x' has no installation candidate
在各种 Stack Exchange 网站上都已经提出了几个与此相关的问题,例如软件包 network-manager-openvpn 不可用在 Ask Ubuntu 上,但这些一般都是关于尽管出现错误,如何获取特定的包。
我发现没有一个包不能简单地(尽管并不总是容易)找到,通过确定它是否仍然分布,以及在哪个存储库下,并确保存储库在 sources.list 中,或者在最坏的情况下,下载 .deb 文件或源文件进行编译。
所以我的问题比较笼统,虽然我猜测它的答案相当简单,因此没有什么令人兴奋的,但我想不出如何通过传统的搜索引擎方法找到它,所以我转向 Ask Ubuntu。
是否有一个命令或选项可以用来确定哪些包引用了丢失的包?
答案1
有时发生这种情况是因为 APT 根本不知道您在说什么,但可以通过运行以下命令解决:
sudo apt-get update
运行此程序后,错误通常会消失,因为apt
知道apt-get
如何执行我现在要求的操作。
答案2
您可以使用 apt-cache 搜索软件包:
apt-cache search x
这将输出以某种方式引用 x 的所有包。
答案3
您可以运行此命令来查看包的所有反向依赖关系(替换PACKAGENAME
为包名称):
apt-cache showpkg PACKAGENAME
什么是反向依赖?如果包 X 依赖于包 Y,则 Y 是 X 的依赖项,而 X 是 Y 的反向依赖项。
尝试通过运行删除一些反向依赖项sudo apt remove NAME
。
您可能还想尝试删除不再可用的包的所有配置:
sudo apt purge PACKAGENAME
答案4
根据以往的经验,通常:
- 使用 进行子字符串包搜索
apt search
有时可能是一个可行的选择,但也有可能包名称不相关、违反直觉或包含中间字符,导致搜索过程无果。在这种情况下,您可以在所需包或库的官方存储库中搜索相应的名称,通常可以在包自述文件或手册中方便地引用它们。 - 您也可能正在尝试安装一个命令(无论它是二进制文件还是可执行文件)或包含在另一个元包或库中的模块,在这种情况下
apt-file search
可能会派上用场。
但是,如果软件包在官方存储库中通常以任何形式不可用,那么作为最后的手段,您可以选择寻找一个社区驱动的存储库,即提供该软件的 PPA,手动安装 deb(祈祷有可用、可安装和兼容的依赖项)或自己编译。