`apt install pkg1 pkg2` 与 `apt install pkg1 && apt install pkg2` 不同,为什么?

`apt install pkg1 pkg2` 与 `apt install pkg1 && apt install pkg2` 不同,为什么?

如果我同时安装这两个软件包,请注意,将安装 php7.4:

$ apt install php7.1 php7.1-redis

The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils ifupdown iproute2 isc-dhcp-client isc-dhcp-common libapache2-mod-php7.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libargon2-0 libatm1 libbsd0 libdns-export162 libedit2
  libgdbm3 libisc-export160 liblua5.1-0 libmnl0 libpcre2-8-0 libperl5.22 libsodium23 libssl1.1 libxtables11 netbase perl perl-modules-5.22 php-common php-igbinary php-redis php7.1 php7.1-cli php7.1-common php7.1-json php7.1-opcache
  php7.1-readline php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-phpdbg php7.4-readline psmisc rename ssl-cert tzdata

如果我单独安装它们,则不会安装 php7.4:

$ apt install php7.1

The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils ifupdown iproute2 isc-dhcp-client isc-dhcp-common libapache2-mod-php7.1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libatm1 libbsd0 libdns-export162 libedit2 libgdbm3
  libisc-export160 liblua5.1-0 libmnl0 libperl5.22 libssl1.1 libxtables11 netbase perl perl-modules-5.22 php-common php7.1 php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-readline psmisc rename ssl-cert tzdata

$ apt install php7.1-redis

The following NEW packages will be installed:
  php-igbinary php-redis

为什么?我对 Linux 并不是完全陌生,但我从未注意到这种行为。

要尝试它,你可以使用 docker:

docker run -it --rm ubuntu:16.04 bash

这些软件包需要额外的 ppa,因此:

apt update && apt install -y software-properties-common
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && apt-get update

您已准备出发。

答案1

apt输出一条容易错过的消息,给出提示:

注意,选择“php-redis”而不是“php7.1-redis”

php7.1-redis不存在,或者更确切地说,它是由 提供的虚拟包php-redis。所以apt改变

apt install php7.1 php7.1-redis

apt install php7.1 php-redis

当同时请求两个包时,apt请考虑它们的所有依赖关系,并且在这种情况下会因其虚拟替代处理而陷入困境。php-redis依赖于phpapi-20190902 | phpapi-20180731 | phpapi-20170718 | phpapi-20160303 | phpapi-20151012 | phpapi-20131226,它由许多具体的 PHP 包提供;aptpicks php7.4-cli,这是按评估顺序排列的第一个满足依赖关系的包。它也解决了php7.1,但可能因为phpapi连接不同(PHP 7.4 提供phpapi-20190902,PHP 7.1 提供phpapi-20160303),没有意识到php7.1最终满足php-redis“依赖关系”。

php-redis安装之后php7.1phpapi要求已经满足,所以apt不再尝试安装任何东西。

相关内容