CIs*_*ies 11 package-management apt dependencies
给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行
sudo apt-get install $pkgs
Run Code Online (Sandbox Code Playgroud)
对比
for p in $pkgs; do sudo apt-get install $p; done
Run Code Online (Sandbox Code Playgroud)
我问的主要是依赖项-topo-sort相关,即是否会以任何一种方式下载和安装不同的软件包
Eli*_*gan 16
是的,可以选择不同的包来满足依赖关系。运行1个命令指定Ñ要安装的软件包有时会具有不同的效果从运行Ñ命令其中的每一个指定要安装1包,即使当所指定的实际的包是在每种情况下是相同的。
主要的实际差异可能是karel 所描述的。然而,由于不同的依赖解析,即使所有操作都成功,效果也可能不同。
原因正如您大致推测的那样:
我问的主要是依赖项-拓扑排序相关
更具体地说,发生这种情况是因为可以有多个满足依赖关系的替代方案。
假设您希望安装 package a,它依赖于一个虚拟 package v,并且v可以通过 packageb或 packagec而不是其他方式来满足。假设b不依赖于c,c不依赖于b,并且这些包都没有安装。现在假设你运行:
sudo apt-get install aRun Code Online (Sandbox Code Playgroud)
然后 APT 将选择b或c来满足依赖关系。它选择哪一个是它执行的计算结果,这可能会受到您安装的软件包、可用的软件包、您使用的 APT 版本以及它的配置方式的影响。但是当所有这些条件都相同时,每次都会做出相同的决定。
不失一般性地假设它选择b。然后a和b安装。假设你然后运行:
sudo apt-get install cRun Code Online (Sandbox Code Playgroud)
之后a,b、 和c都已安装。也就是说,所有三个包都是通过运行安装的:
sudo apt-get install a
sudo apt-get install cRun Code Online (Sandbox Code Playgroud)
相反,假设您要运行此命令而不是那些:
sudo apt-get install a cRun Code Online (Sandbox Code Playgroud)
然后,由于a对 的依赖v由 满足c,b因此未安装。也就是说,只有a和c,而不是b,作为运行的结果被安装:
sudo apt-get install a cRun Code Online (Sandbox Code Playgroud)
您可以通过运行apt或apt-get使用-s选项找到具体示例,这会导致它模拟您的操作而不是执行它。(请记住,您不能仅用apt-get -s/完全确认它们apt -s,因为较早的apt-get -s/apt -s命令不会影响以后的命令,因为它们不会影响任何东西,因为它们只是模拟。)
sudo apt-get install jedit在我的 Ubuntu 16.04 LTS 系统上运行会安装几个 OpenJDK 8 包:
ek@Io:~$ apt -s install jedit
NOTE: This is only a simulation!
apt-get needs root privileges for real execution.
Keep also in mind that locking is deactivated,
so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
ca-certificates-java default-jre default-jre-headless java-common java-wrappers openjdk-8-jre openjdk-8-jre-headless
Suggested packages:
default-java-plugin icedtea-8-plugin fonts-wqy-zenhei fonts-indic
The following NEW packages will be installed:
ca-certificates-java default-jre default-jre-headless java-common java-wrappers jedit openjdk-8-jre
openjdk-8-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Run Code Online (Sandbox Code Playgroud)
如果我告诉 APT 同时安装jedit和openjdk-9-jre运行sudo apt-get install jedit openjdk-9-jre,那么它不会安装 OpenJDK 8 包,因为jeditOpenJDK 9 包满足 对 Java 运行时的依赖:
ek@Io:~$ apt -s install jedit openjdk-9-jre
NOTE: This is only a simulation!
apt-get needs root privileges for real execution.
Keep also in mind that locking is deactivated,
so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
ca-certificates-java java-common java-wrappers libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre-headless
Suggested packages:
default-jre icedtea-8-plugin fonts-indic
The following NEW packages will be installed:
ca-certificates-java java-common java-wrappers jedit libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre
openjdk-9-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Inst libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Inst openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Conf libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Conf openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Run Code Online (Sandbox Code Playgroud)
如果我安装jedit并openjdk-9-jre使用两个单独的sudo apt-get install命令,按该顺序发出,那么我将同时获得 OpenJDK 8 和 OpenJDK 9 包。
如果从很长的软件包列表中甚至无法安装一个软件包,那么该命令的执行将停止并打印一条信息性错误消息。批量安装一长串软件包也可能令人沮丧,因为某些软件包需要在终端中进行交互式用户输入才能成功安装。如果您在用户输入中犯了错误,那么您将不得不从头开始重新启动整个安装过程。
除非您将最初的长包列表分成 25-40 个包的组,然后一次安装一组,否则很难让命令成功执行直到最后。这不会花费太多额外时间,并且使所有软件包的安装更易于管理。
再记住一件事。sudo apt install在/var/lib/dpkg/运行时锁定管理目录 ( ),因此在 apt 完全完成处理之前不要运行任何其他需要 root 权限的进程。例如,如果您从终端使用 apt 安装软件包,请不要尝试从终端在新选项卡或窗口中安装其他 snap 软件包,直到 apt 完成处理。