从.deb文件安装的程序如何进行更新?

我对Ubuntu中的整个更新机制以及安装软件的最佳实践存在一些困惑。

我知道有一个/etc/apt/sources.list文件,其中列出了所有的软件源,当我使用apt-get update命令时,会查询这些软件源,然后可以用apt-get upgrade等命令进行更新。这是非常合理的,最近我通过将deb http://repository.spotify.com stable non-free添加到这个"sources"列表中来安装了Spotify。

但是后来我感到困惑...

当我要下载Google Chrome时,我只需要下载并获取一个.deb文件,然后Chrome就顺利安装了...但我在/etc/apt/sources.list中没有看到任何新的条目...

那么apt-get update是如何知道在哪里查询关于Chrome更新的呢?它是否已经被添加到了源文件中已有的某个软件源中?

我希望所有我安装的软件都能够被包含在更新功能中。

2个回答

这确实有点复杂。首先,`apt`是一个前端,用于处理安装/删除软件包的`dkpg`实际上会处理安装/删除软件包。因此,`/etc/apt/sources.list`(以及`/etc/apt/sources.list.d/`目录中的任何文件)将由`apt`而不是`dpkg`读取。
现在,当您手动下载一个`.deb`文件时,您将绕过`apt`,并使用`dpkg -i packagename.deb`来安装它。这意味着apt的数据库将不会更新,并且apt系统将不知道您安装的软件包。换句话说,`apt-get upgrade`将永远不会更新任何手动安装的软件包。
话虽如此,`chrome`实际上是个例外。当您访问其下载页面时,您会看到以下消息:

 enter image description here

底部有这样的注释:
注意:安装Google Chrome将添加Google存储库,因此您的系统将自动保持Google Chrome的最新状态。如果您不想要Google的存储库,请在安装软件包之前执行“sudo touch /etc/default/google-chrome”。
这意味着.deb软件包包含一个脚本,将向您的系统添加Google的存储库(具体来说,它将在/etc/apt/sources.list.d/创建一个文件),从而确保您使用apt-get时chrome会得到更新。

好的,有道理...但是有没有办法轻松管理我手动安装的所有软件包的更新呢? - Kirbies
2@Morten 不,这正是为什么存在 apt 等工具的原因,如果你走出了这个系统,就只能靠自己了。虽然有一些技巧,但对于你可能手动安装的少数软件包来说,很少值得花费这样的努力。 - terdon
2软件包管理器实际上并不关心一个软件包是由dpkg还是apt安装的。如果在软件源中找到了一个更新版本的软件包,那么这个更新版本将被安装。 - Florian Diesch
@FlorianDiesch 是的,当然。我的意思是针对不在软件仓库中的软件包。 - terdon

apt在列出的源中搜索,包括/etc/apt/sources.list和/etc/apt/source.list.d目录下的所有文件。你会在/etc/apt/sources.list.d目录下找到一个名为google-chrome.list的文件,其中包含以下行:
deb http://dl.google.com/linux/chrome/deb/ stable main

这是用于更新 Google Chrome 的源。

当您手动下载并安装 Google Chrome 的 deb 文件时,deb 文件中的脚本会创建此文件,以便您无需手动搜索更新。