有没有感觉debian的依赖过于严重,依赖方面没有那么自由?

像安装wm(awesome)里面会依赖menu和feh,或者xfce4-terminal/gnome-terminal等我知道的软件,依赖别的软件都超多,这些不应该是选配软件吗?
如果删除其中一个依赖,目的软件也都一起删除,感觉有点奇怪。
不止哪位能解惑一下?

archlinux awesome 的依赖

debian awesome 的依赖

先借鉴一下大佬的知乎作答.

作者:farseerfc
链接:为什么说Arch Linux的pacman包管理系统更先进?相比与apt或rpm等好在哪里呢? - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

舉個例子談一下 pacman/Arch Linux 對依賴關係的處理。乍看起來 Arch Linux 和別的系統在依賴關係上就是粗放打包和精細打包的區別而已,實質上更重要的是, Arch Linux 的滾動更新模型不支持「部分更新(partial update)」。部分更新簡單地說就是系統中只選擇性地更新一部分包而不更新所有包。考慮 A 和 B 各自依賴 C ,現在你想更新 B ,新的 B 需要新的 C 庫,於是要同時更新 C ,這個更新會不會破壞 A 呢?很有可能。所以要支持部分更新的話,就要考慮每個包之間的版本依賴。所以你去看 debian/fedora/opensuse 里的依賴關係,都是一長串包版本的區間範圍,他們必須寫清楚 A 1.2.3 依賴 C >=1.0.0 並且 C<=1.9.8 這種關係。而在 Arch Linux 這邊,由於不支持部分更新,所以大多數情況下寫個 A 依賴 C 就足夠了。同樣由於要考慮部分更新,debian/fedora/opensuse 那邊每次更新一個包,實際上都是在全系統範圍內解決一個非常龐大的布爾不等式滿足問題(Boolean satisfiability problem),理論上這是一個複雜的 NPC 問題,所以他們都引入了複雜的 SAT solver (比如GitHub - openSUSE/libsolv: Library for solving packages and reading repositories) 去算出一個或者多個可行的解,然後每次升級都可能升一部分包的版本,降另一部分包的版本,安裝一些包,再刪除另一些包,最終滿足全局的依賴關係,或者在不可能滿足的情況下給出多個最小的破壞依賴關係的方案。有沒有聽起來很複雜?反觀 Arch 這邊,由於大多數依賴關係都是 「A 依賴 C」這種簡單明瞭的關係,大多數情況下把所有包裝到最新就能解決了,如果不能滿足,那麼 pacman 就簡單地罷工報錯,讓用戶自己想辦法手動去解決。

现在开始回答问题

  1. 安装wm(awesome)里面会依赖menu和feh,或者像xfce4-terminal/gnome-terminal,依赖的软件都超多,这些不应该是选配软件吗?

$ sudo apt-cache depends awesome
awesome
Depends: libc6
Depends: libcairo2
Depends: libdbus-1-3
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
Depends: liblua5.1-0
Depends: libstartup-notification0
Depends: libx11-6
Depends: libxcb-cursor0
Depends: libxcb-icccm4
Depends: libxcb-keysyms1
Depends: libxcb-randr0
Depends: libxcb-render0
Depends: libxcb-shape0
Depends: libxcb-util0
Depends: libxcb-xinerama0
Depends: libxcb-xkb1
Depends: libxcb-xrm0
Depends: libxcb-xtest0
Depends: libxcb1
Depends: libxdg-basedir1
Depends: libxkbcommon-x11-0
Depends: libxkbcommon0
Depends: menu为所有菜单相关的应用程序生成程序菜单
menu:i386
Depends: dbus-x11
dbus-x11:i386
Depends: lua-lgi
Depends: gir1.2-freedesktop
Depends: gir1.2-pango-1.0
Recommends: x11-xserver-utils
Recommends: rlwrap
Recommends: feh(这个是建议安装,为什么会自动安装看这里)

  1. 如果删除其中一个依赖,源文件(我没懂你的’源文件’的意思)也都一起删除,感觉有点奇怪。

我将’源文件’和依赖当作以下关系进行作答
软件包A
    Depends:B
    Depends:C
    Depends:D
    Depends:E
    Recommends: F
由于A依赖D,当你删除D的时候,其实破坏了软件包A的依赖,那么apt删除软件包A也是理所当然了.看下面的操作

$ sudo apt remove gnome-terminal
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages were automatically installed and are no longer required:
fonts-linuxlibertine fonts-sil-gentium fonts-sil-gentium-basic gnome-terminal-data hyphen-en-us
libreoffice libreoffice-help-en-us libreoffice-librelogo libreoffice-nlpsolver
libreoffice-ogltrans libreoffice-pdfimport libreoffice-script-provider-bsh
libreoffice-script-provider-js libreoffice-script-provider-python libreoffice-wiki-publisher
mythes-en-us
Use ‘sudo apt autoremove’ to remove them.
The following packages will be REMOVED:
gnome gnome-core gnome-terminal task-gnome-desktop
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
After this operation, 1,238 kB disk space will be freed.

可以看到,我在移除软件包gnome-terminal的同时,apt要求我使用’sudo apt autoremove’ to remove gnome gnome-core gnome-terminal task-gnome-desktop.

软件包之间的关系

- Depends 此软件包仅当它依赖的软件包均已安装后才可以安装。此处请写明你的程序所必须的软件包,如果没有要求的软件包该软件便不能正常运行(或严重抛锚)的话。
  • Recommends
    这项中的软件包不是严格意义上必须安装才可以保证程序运行。当用户安装软件包时,所有前端工具都会询问是否要安装这些推荐的软件包。aptitude 和 apt-get 会在安装你的软件包的时候自动安装推荐的软件包(用户可以禁用这个默认行为)。dpkg 则会忽略此项。

  • Suggests
    此项中的软件包可以和本程序更好地协同工作,但不是必须的。当用户安装程序时,所有的前端程序可能不会询问是否安装建议的软件包。aptitude 可以被配置为安装软件时自动安装建议的软件包,但这不是默认。dpkg 和 apt-get 将忽略此项。

  • Pre-Depends
    此项中的依赖强于 Depends 项。软件包仅在预依赖的软件包已经安装并且 正确配置 后才可以正常安装。在使用此项时应 非常慎重,仅当在 debian-devel@lists.debian.org 邮件列表讨论后才能使用。记住:根本就不要用这项。 :slight_smile:

  • Conflicts
    仅当所有冲突的软件包都已经删除后此软件包才可以安装。当程序在某些特定软件包存在的情况下根本无法运行或存在严重问题时使用此项。

  • Breaks
    此软件包安装后列出的软件包将会受到损坏。通常 Breaks 要附带一个“版本号小于多少”的说明。这样,软件包管理工具将会选择升级被损坏的特定版本的软件包作为解决方案。

  • Provides
    某些类型的软件包会定义有多个备用的虚拟名称。你可以在 virtual-package-names-list.txt.gz文件中找到完整的列表。如果你的程序提供了某个已存在的虚拟软件包的功能则使用此项。

  • Replaces
    当你的程序要替换其他软件包的某些文件,或是完全地替换另一个软件包(与 Conflicts 一起使用)。列出的软件包中的某些文件会被你软件包中的文件所覆盖。

3 个赞