对系统所做的更改

对系统所做的更改

假设 (pseudo-)packageA依赖于 (pseudo-)package B

我正在寻找一种合理的系统方法来回答这个问题:“通过安装我会得到什么,A而单独安装却无法得到什么B?”

用最抽象的术语来说,我想确定AB的依赖图之间的差异。

有没有一种方便的方法可以使用标准dpkg*, apt*,aptitude*工具来做到这一点?


由于我对尽可能笼统的答案感兴趣,我不愿意给出一个具体的例子(这样的例子往往会引出仅适用于示例而不适用于一般情况的答案),但不可避免地有人发表评论询问举个具体的例子,如下:

A可能是task-xfce-desktop并且B可能是xfce4

或者A可能是xfce4并且B可能是xfdesktop4


编辑:澄清(回应斯蒂芬·基特的回答):我确实对绝对依赖图之间的差异感兴趣(无论我的系统的当前状态如何)。

答案1

我将详细介绍两种方法,一种方法分析将对系统进行的更改,另一种方法分析完整的依赖关系树。

对系统所做的更改

假设您对当前系统所做的更改感兴趣,而不是“绝对”依赖链,您可以模拟这两个包的安装并比较结果:

(comm -3 <(apt-get -s install A | awk '/^Inst / { print $2 }' | sort) <(apt-get -s install B | awk '/^Inst / { print $2 }' | sort)) 2>/dev/null

这要求apt-get模拟 ( -s) 安装A,并过滤掉将要安装的软件包列表(以 开头的行中的第二项Inst);它与 执行相同的操作B,对两个列表进行排序并将它们与 进行比较comm,丢弃任何公共包 ( -3)。 to的最终重定向stderr/dev/null丢弃apt-get无关的输出(如果有)(但您不会看到任何错误)。

xfce4和为例xfdesktop4,这会产生(在我的系统上,两者都没有安装)

gtk2-engines-xfce
libkeybinder-3.0-0
libxfce4panel-2.0-4
libxfce4ui-2-0
libxfce4ui-utils
orage
pavucontrol
thunar
thunar-volman
xfce4
xfce4-appfinder
xfce4-notifyd
xfce4-panel
xfce4-pulseaudio-plugin
xfce4-session
xfce4-settings
xfwm4
xscreensaver
xscreensaver-data

只有一列,最左边的一列,所以这是安装xfce4将在我的系统上安装的软件包列表,超出了安装xfdesktop4将安装的软件包。如果您选择A两者B都不相互依赖,您将得到两列,第一列显示A的唯一依赖项,第二列显示B的唯一依赖项。

完整的依赖树

通过使用 ,可以将其调整为在完整依赖关系树上工作apt-rdepends。要获取包 A 所依赖的所有唯一包(直接或间接,包括预依赖项):

apt-rdepends A | awk '/^  .*Depends/ { print $2; }' | sort -

这忽略了任何版本限制,但在这种情况下不应有太多发生率。

因此:

comm -3 <(apt-rdepends A | awk '/^  .*Depends/ { print $2; }' | sort -u) <(apt-rdepends B | awk '/^  .*Depends/ { print $2; }' | sort -u)

列出 A 和 B 的所有依赖项,并列出不同的依赖项(左列中 A 独有的依赖项,右列中 B 独有的依赖项)。

xfce4再次运行它xfdesktop4给出

adwaita-icon-theme
dconf-gsettings-backend
dconf-service
desktop-file-utils
glib-networking
glib-networking-common
glib-networking-services
gsettings-backend
gsettings-desktop-schemas
gtk2-engines-xfce
hicolor-icon-theme
libasyncns0
libatk-bridge2.0-0
libatspi2.0-0
libcairo-gobject2
libcap2
libcolord2
libcroco3
libdconf1
libdrm2
libegl1-mesa
libepoxy0
libflac8
libgbm1
libgnutls30
libgtk-3-0
libgtk-3-bin
libgtk-3-common
libgudev-1.0-0
libhogweed4
libical1a
libidn11
libjson-c2
libjson-glib-1.0-0
libjson-glib-1.0-common
libkeybinder-3.0-0
liblcms2-2
libnettle6
libogg0
libpolkit-gobject-1-0
libpopt0
libproxy1v5
libpulse0
libpulse-mainloop-glib0
librest-0.7-0
librsvg2-2
librsvg2-common
libsndfile1
libsoup2.4-1
libsoup-gnome2.4-1
libsqlite3-0
libstdc++6
libudev1
libupower-glib3
libvorbis0a
libvorbisenc2
libwayland-client0
libwayland-cursor0
libwayland-egl1
libwayland-egl1-mesa
libwayland-server0
libwrap0
libxaw7
libxcb-dri2-0
libxcb-dri3-0
libxcb-present0
libxcb-randr0
libxcb-shape0
libxcb-sync1
libxcb-xfixes0
libxfce4panel-2.0-4
libxfce4ui-2-0
libxfce4ui-utils
libxkbcommon0
libxkbfile1
libxklavier16
libxmu6
libxpm4
libxshmfence1
libxt6
libxtst6
orage
thunar
tzdata
x11-xkb-utils
xfce4-appfinder
xfce4-panel
xfce4-pulseaudio-plugin
xfce4-session
xfce4-settings
xfdesktop4
xfwm4
xkb-data

apt-rdepends如果您希望包含“推荐”或“建议”,您可以调整选项(请参阅-f选项)。

相关内容