下載/安裝軟體包清單和單獨下載每個軟體包之間有區別嗎?

下載/安裝軟體包清單和單獨下載每個軟體包之間有區別嗎?

給定開發包清單(例如 pkgs="python3.5-dev python3-tk"),運行之間會有差異嗎

sudo apt-get install $pkgs 

for p in $pkgs; do sudo apt-get install $p; done

我主要是問依賴拓撲排序相關的,即是否會以任何一種方式下載和安裝不同的軟體包

答案1

是的,可以選擇不同的套件來滿足依賴關係。運行 1 個指定的命令要安裝的軟體包有時會產生與運行不同的效果每個命令都指定要安裝 1 個軟體包,即使指定的實際軟體包在每種情況下都是相同的。

主要的實際的差異可能就是一個卡雷爾描述了然而,即使所有操作都成功,由於依賴關係解析不同,效果也可能不同。

原因正如您大致猜測的那樣:

我主要是問依賴拓撲排序有關的

更具體地說,發生這種情況是因為可能有不只一種替代方案可以滿足依賴性。

摘要說明

假設你想安裝套件a,這取決於虛擬包 v, 和v可以透過包裝滿足b或包裝c並且沒有其他方式。認為b不依賴於c,c不依賴於b,並且這些軟體包都尚未安裝。現在假設您運行:

sudo apt-get install a

然後APT會選擇b或者c來滿足依賴性。它選擇哪一個是它執行計算的結果,該計算可能會受到您已安裝的軟體包、可用的軟體包、您正在使用的 APT 版本及其配置方式的影響。但當所有這些條件都相同時,每次都會做出相同的決定。

認為不失一般性它選擇的b。然後ab已安裝。假設您隨後運行:

sudo apt-get install c

在那之後,a,b, 和c均已安裝。也就是說,在執行以下命令後,所有三個軟體包均已安裝:

sudo apt-get install a
sudo apt-get install c

相比之下,假設您要執行此命令而不是那些命令:

sudo apt-get install a c

然後,自從a的依賴v滿足於c,b未安裝。也就是說,僅ac, 但不是b,作為運行的結果安裝:

sudo apt-get install a c

具體例子

apt您可以透過運行或apt-get使用該選項找到具體的範例-s,這會導致它模擬您的操作而不是執行它。 (請記住,您不能只使用apt-get -s/完全確認它們apt -s,因為較早的apt-get -s/apt -s命令不會影響後面的命令,因為它們不會影響任何內容,因為它們只是模擬。)

在我的 Ubuntu 16.04 LTS 系統上運行sudo apt-get install jedit將安裝多個 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])

如果我透過運行告訴 APT 安裝jedit和,那麼它就不會安裝 OpenJDK 8 軟體包,因為OpenJDK 9 軟體包滿足了對 Java 運行時的依賴:openjdk-9-jresudo apt-get install jedit openjdk-9-jrejedit

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])

如果我安裝jeditopenjdk-9-jre使用兩個單獨的sudo apt-get install命令(按該順序發出),那麼我將同時獲得 OpenJDK 8 和 OpenJDK 9 軟體包。

答案2

如果無法安裝一長串軟體包中的一個軟體包,則該命令的執行將停止,並列印一條資訊豐富的錯誤訊息。大量安裝一長串軟體包也可能令人沮喪,因為某些軟體包需要在終端機中進行互動式使用者輸入才能成功安裝。如果使用者輸入錯誤,則必須從頭開始整個安裝過程。

除非您將最初的一長串軟體包分成 25-40 個軟體包的群組,然後使用 apt 一次安裝一組軟體包,否則很難讓命令成功執行到最後。這不會花費太多額外時間,並且使所有軟體包的安裝更易於管理。

只要記住一件事。在執行時間sudo apt install鎖定管理目錄 ( ),因此在 apt 完全完成處理之前不要執行任何其他需要 root 權限的進程。/var/lib/dpkg/例如,如果您正在從終端使用 apt 安裝軟體包,則在 apt 完成處理之前,請勿嘗試在新分頁或視窗中從終端機安裝其他快照軟體包。

相關內容