简而言之:在任务选择(tasksel)和使用apt-get安装任务的过程中存在差异。
看看你的例子:
使用apt-get的方式
sudo apt-get install 'lamp-server^'
将执行以下操作:
搜索缓存(软件包列表文件)中所有的“Task:”字段,并获取所有带有“lamp-server”的内容。
以标准方式安装这些软件包:
sudo apt-get install package1 package2...
使用tasksel的方法
sudo tasksel install lamp-server
会在其配置文件/usr/share/tasksel/**/*.desc
中查找名为"lamp-server"的任务:
搜索配置文件中名为"Task:"的字段,其值为"lamp-server"。
检查是否满足所有先决条件("Key:"字段),如果未安装,则记住它们。
选择一种方法来选择软件包("Packages:"字段)。如果是"list",则按名称安装以下软件包。
阅读所有后续软件包名称,并将其传递给之前选择的方法以生成软件包名称。
查找"/usr/lib/tasksel/info/lamp-server.preinst"。如果存在,则执行此脚本。
使用以下命令使用apt-get安装软件包:
debconf-apt-progress -- apt-get -q -y -o APT::Install-Recommends=true -o APT::Get::AutomaticRemove=true install package1 package2 ...
查找"/usr/lib/tasksel/info/lamp-server.postinst"。如果存在,则执行此脚本。
结论
tasksel在处理和选择任务方面更强大。它可以在安装/卸载任务之前/之后执行额外的脚本。而最大的好处是:您可以非常容易地修改任务并创建新任务。无法在没有缺点(有效签名)的情况下编辑官方软件包列表文件。
回到您的第一个问题:
在您的特殊情况下,这两个命令几乎是等效的(假设您已经启用了APT::Install-Recommends
和APT::Get::AutomaticRemove
)。唯一的区别是mysql-server
和apache2
依赖项的扩展软件包状态(使用普通apt-get设置为“手动安装”)。
那么元软件包呢?
如果您不使用tasksel的功能,例如选择任务(在安装过程中特别有帮助)以及在某些任务块之前和之后执行额外命令,那么任务与元包非常相似。区别在于:任务未在APT缓存中注册为软件包。
因此,如果您卸载一个任务依赖项,其他任务依赖项不会被标记为自动安装,因为它们是明确安装的。如果您卸载一个元包,依赖项将通过
autoremove
一起被删除,因为它们的扩展软件包状态为"自动安装"(如果没有手动安装)。
注意:Debian中分发的所有任务都会安装一个名为
task-TASKNAME
的元包。
给出您的例子:
sudo apt-get install kubuntu-desktop
- 安装元包
kubuntu-desktop
。依赖项将会被"自动安装"。
sudo apt-get install kubuntu-desktop^
- 选择所有标记为"kubuntu-desktop"任务的软件包,这些都是元包
kubuntu-desktop
的依赖项。它们都被标记为"手动安装"。
sudo tasksel install kubuntu-desktop
- 在安装任务包的软件包之前,请确保已安装 X。
- 安装元包
kubuntu-desktop
。依赖项将会被"自动安装"。
apt-get install -s lubuntu-desktop
和apt-get install -s lubuntu-desktop^
的输出有什么不同。在后者中,你会看到像这样的额外信息:注意,选择'policykit-1-gnome'作为任务'lubuntu-desktop' / 注意,选择'gnome-keyring'作为任务'lubuntu-desktop' / 注意,选择'libplist1'作为任务'lubuntu-desktop' / 注意,选择'aspell-en'作为任务'lubuntu-desktop' / 注意,选择'libsdl1.2debian'作为任务'lubuntu-desktop' / 所以,在这个特定情况下,我不确定“脱字符”哪一个更好。 - user25656