跳至內容

相依性地獄

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

相依性地獄(英語:dependency hell),又稱依賴地獄,是指在作業系統中由於軟件之間的依賴性不能被滿足而引發的問題。

一個軟件套件依賴於其它必要的軟件套件(且版本要符合要求),使得軟件套件系統形成了複雜的依賴關係網絡,並可能引發一系列問題。一些軟件套件可能因為依賴性無法滿足,需要安裝大量軟件套件;另一方面,一個軟件套件的解除安裝可能引發數量眾多的軟件套件無法工作。

目前,GNU/Linux通過進階軟件套件管理機制,一定程度上解決了相依性地獄問題。較著名的有Debian陣營的APT[1]Redhat陣營的Yum,及 Yum 的後繼包管理工具 DNF[2]

問題由來

相較「另起爐灶」的做法,現代軟件往往會利用一些已有的組件(如庫、程式、多媒體檔案)進行開發。這些組件可能是某個軟件,也可能是專門為其他軟件使用而設計()。程式開發者根據特定版本的組件來設計自己的軟件。這種方式減少了開發的工作量,使得程式比較輕便。但是該軟件要正確執行,必須安裝了指定版本的某些組件。

做一個比喻:你在建造一所房子,而並不生產門窗。由於門洞和窗口的尺寸要和門窗配合,因此你不得不尋找了一家門窗廠商,以他們生產的門窗作為標準,來建造合適的房子。你建造的房屋必須依賴於這家門窗廠商所生產的特定型號的門。

這便是相依性的產生過程。

若只有簡單的相依性,則比較容易解決。如A軟件依賴e、z軟件套件,而e、z軟件套件沒有依賴,只需要安裝e、z軟件套件,再安裝A軟件即可。就如建造商與門窗商的依賴關係,簡單明了。

而當依賴性過多,且具有多級結構,形成錯綜複雜的網絡,依賴性的解析就會變得異常困難,甚至出現無法解析的致命錯誤

  • 由於軟件套件更新迅速,且互相不同步,依賴性所要求的版本條件可能很快便不存在。
  • 當多個軟件套件同時依賴於一個軟件套件,但所要求的版本不同。如A軟件套件依賴gcc-4.6及以上而B軟件依賴gcc-4.5,那麼就會產生相依性衝突。這種情況下,兩個軟件套件A、B無法同時滿足依賴性,無法同時安裝或執行。
  • 當一個軟件套件依賴多個軟件套件,解析依賴性的難度會加大。如A軟件套件依賴40個軟件套件,而這40個軟件套件每個又都有自身的依賴關係,依賴關係深達3-5層。這樣的計算,靠人力有時是難以完成的,必須藉助軟件套件管理器進行自動解析。同時,安裝組件的數量也會由於依賴性過多而增長。
  • 當兩個軟件套件不共存的時候,可能會對整個體系造成巨大衝擊。若是兩個底層軟件套件,則影響會更大。由依賴關係形成的網絡會斷裂為不共存的兩部分。在建立軟件套件體系的過程中,要儘量避免這種情況發生,尤其是底層軟件套件的不共存問題。
  • 在特殊情況下還會產生不可解的依賴關係,如依賴無窮迴圈

問題類型

依賴過多

一個軟件套件可能依賴於眾多的庫,因此安裝一個軟件套件的同時要安裝幾個甚至幾十個庫包。

多重依賴

指從所需軟件套件到最底層軟件套件之間的層級數過多。這會導致依賴性解析過於複雜,並且容易產生依賴衝突和環形依賴。

依賴衝突

即兩個軟件套件無法共存的情況。除兩個軟件套件包含內容直接衝突外,也可能因為其依賴的低層軟件套件互相衝突。因此,兩個看似毫無關聯的軟件套件也可能因為依賴性衝突而無法安裝。

依賴迴圈

即依賴性關係形成一個閉合環路,最終導致:在安裝A軟件套件之前,必須要安裝A、B、C、D軟件套件,然而這是不可能的。

參考文獻

參照
  1. ^ DebianPackageManagement. [2018-04-03]. (原始內容存檔於2008年12月4日). 
  2. ^ Fedora Wiki, Yum頁面存檔備份,存於互聯網檔案館(英文)

參見