我应该使用tasksel、APT中的tasks还是安装常规的元包?

Tasksel还是纯Apt?

过去我一直使用tasksel来安装所谓的“任务”。然而,似乎这已经整合到了APT中:

apt-cache dumpavail | grep ^Task
[...] snip
Task: lamp-server
[...]

我可以通过在其后添加一个插入符号(^)来安装这样的“任务”,就像这样:
sudo apt-get install lamp-server^

这是否等同于以下内容?
sudo tasksel install lamp-server

哪个是首选?

元包

此外,元包在这里起到什么作用?有些任务似乎不是元包,而其他任务则是:

apt-cache show lamp-server
N: Unable to locate package lamp-server

apt-cache show kubuntu-desktop
Package: kubuntu-desktop
[...]
Task: kubuntu-desktop

所以,使用最后一个例子,以下三种可能的安装方式有什么区别?
1. sudo apt-get install kubuntu-desktop 2. sudo apt-get install kubuntu-desktop^ 3. sudo tasksel install kubuntu-desktop

2看看 apt-get install -s lubuntu-desktopapt-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
更多阅读请点击此处:http://askubuntu.com/a/249373/25656 - user25656
2关于tasksel的警告:绝对不要使用它来删除任务 - 请参阅在launchpad上的错误报告 - guntbert
1个回答

简而言之:在任务选择(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-RecommendsAPT::Get::AutomaticRemove)。唯一的区别是mysql-serverapache2依赖项的扩展软件包状态(使用普通apt-get设置为“手动安装”)。

那么元软件包呢?

如果您不使用tasksel的功能,例如选择任务(在安装过程中特别有帮助)以及在某些任务块之前和之后执行额外命令,那么任务与元包非常相似。区别在于:任务未在APT缓存中注册为软件包。
因此,如果您卸载一个任务依赖项,其他任务依赖项不会被标记为自动安装,因为它们是明确安装的。如果您卸载一个元包,依赖项将通过autoremove一起被删除,因为它们的扩展软件包状态为"自动安装"(如果没有手动安装)。
注意:Debian中分发的所有任务都会安装一个名为task-TASKNAME的元包。
给出您的例子:
  1. sudo apt-get install kubuntu-desktop
    • 安装元包 kubuntu-desktop。依赖项将会被"自动安装"。
  2. sudo apt-get install kubuntu-desktop^
    • 选择所有标记为"kubuntu-desktop"任务的软件包,这些都是元包 kubuntu-desktop 的依赖项。它们都被标记为"手动安装"。
  3. sudo tasksel install kubuntu-desktop
    • 在安装任务包的软件包之前,请确保已安装 X。
    • 安装元包 kubuntu-desktop。依赖项将会被"自动安装"。