Unix 的包依賴是如何形成的?
OS X 安裝軟體需要解決包依賴關係嗎?為什麼 Linux 總是在安裝軟體時才解決包依賴關係?
因為開源的那幫人都有強迫症,希望所有的庫在系統里只有一份。
不過 Linux 也已經在逐漸改變這一情況了,前有 Docker,後有 FlatPak 和 Snap。
OS X的情況不清楚。我個人的理解是這樣的:在Unix-like的軟體包管理器下,一個軟體包只是提供軟體本身的功能,不包含其它需要的包,通過軟體包管理器處理安裝。而在Unix-like下的不通過軟體包使用的程序,有的已經帶了依賴,有的是需要編譯的源代碼。
一般在Windows下的exe等安裝包大部分都自己帶了依賴,但是可能會有實現重複功能的dll,有的時候dll版本號不同,由於安裝程序處理的原因,會造成DLL地獄(https://zh.wikipedia.org/wiki/DLL%E5%9C%B0%E7%8D%84)
(理解可能有錯誤)任何程序員寫程序都有可能會依賴一些別人已經寫成的庫,所以幾乎一定規模的程序必然有依賴。
不同體系用不同的方法解決依賴問題。
GNU/Linux:通常這個系統大多數軟體是自由軟體,換句話說,他們通常依賴的庫也是自由的,所以軟體開發者認為你可以自由的獲取這些依賴庫,自然就不需要自己再提供了。由系統「發行版」負責維護屬於這個系統的所有依賴庫,並且安裝軟體時確定依賴。這個體系的特點是:
- 系統依賴通常是統一的,如果有多個程序依賴同一個庫,在這個系統中通常是同一份。
- 具有龐大的資源。例如 Debian 系現成的可依賴軟體多達 30G,所以通常不可能預先把所有依賴都安裝全,但龐大的依賴庫給編程人員提供了很多方便。
- 你安裝的軟體越多,共同依賴所體現出的價值越高,解決依賴問題就越簡單(因為當你安裝足夠多軟體時,主流的依賴已經全部在你系統了)。
- 由於巨大的共同依賴庫存在,軟體本身可以很小。
- 沒有一個龐大的公共庫,很多功能以及基礎庫都是每個公司自己實現一套,浪費很多勞動力,編程人員到每個公司得學習一套不同的庫,給編程人員帶來不便。
- 所有應用程序都自己帶依賴,因此很可能有許多程序同時附帶了相同的依賴,並且這些相同依賴還有可能是不同的版本,這會造成許多混亂。
- 由於所有應用程序都自己提供所有依賴,每個軟體體積都很龐大。
- 系統中安裝的軟體越多,越容易出問題。
首先,「包依賴」是某些 Linux 發行版上比較嚴重的現象,與一般意義上的 Unix (包括 OS X) 無關。
其次,「包依賴」是懼怕 redundancy 的想法發展為惡趣味之後的產物。
第三,在 OS X,商業 Unix,和 Windows 中也多多少少有「懼怕 redundancy」的思維,為什麼沒有形成嚴重的包依賴局面呢?這是因為在多方提供安裝包的情況下,象 dependency management 這樣複雜的機制是根本無法運轉的。到了某些 Linux 發行版上,它們的所有 installation package 其實都是這個發行版的開發者自己進行二次封裝的。有了這個基礎,他們才開始樂此不疲的玩起「包依賴」藝術來。因為傳統的Unix認為軟體安裝包=源代碼包,認為操作系統=IDE。因此系統里的庫,既是運行庫,也經常是開發庫 =&> 軟體安裝包就不需要、不應當攜帶一堆依賴的庫 =&> 操作系統就有解決依賴庫的需求 =&> 需要一個集中式的包管理器。
實際上,對於開發人員來講,集中式包管理系統是非常方便的,特別是當你對庫的特定版本要求不高的時候。微軟最近推出了一套非常類似Linux包管理器的玩意,廣受好評。
此外,開源世界裡大量的庫,是執行功能非常單一的小庫,而不是像Qt那樣的大型、綜合解決方案。那麼你要是想自己帶DLL,就得帶一大堆。
OS X 安裝軟體需要解決包依賴關係嗎?
顯然不需要。OS X的軟體發布使用bundle,軟體和它需要的資源塞在一個目錄里。除非你在OS X上裝GNU那一套,才需要包管理器。
為什麼 Linux 總是在安裝軟體時才解決包依賴關係?
你怎麼可能預知?
倖存偏差的又一典型,不是其他平台不需要解決依賴,而是商家不會把這種事情交給用戶。
windows 那一堆 vc runtime 2008, 或者 .net4 也是依賴呀,但為什麼沒有造成用戶困擾呢?
而當「macOS平台上沒有暴露給用戶解決依賴的界面」成為共識後,連技術偏向的軟體也不會把解決依賴留給用戶。最近消息稱 macOS High Sierra 之後將徹底不再支持32位軟體,這不是不需要解決依賴,是直接把依賴給剁了,你猜軟體商家會咋搞?類似的兼容舊版系統的事情,你讓商家把依賴交給用戶解決試試,那是關乎賺多少錢的事情。最近一個頁面,為了讓更多的用戶訪問,連一個提示升級瀏覽器的界面都給 上古 IE5 兼容了。
簡單一句話,賺錢的事情沒有 cover 到 linux 桌面。當它真有來的一天,自然會有解決方案。比如在某巨頭的領頭下達成一個共識。
相對而言 cover 到了 linux 伺服器,所以給 linux 內核貢獻代碼的公司有一堆,c++ 庫 和 其他語言的庫 用包管理器可以輕鬆的解決。
Unix的全局包依賴是最糟糕的想法之一。Userland程序自顧自就好了嘛,井水不犯河水,就像DOS時代一樣。
避免重複造輪子,好多功能都有現成的開源庫,這樣能讓開發人員把更多的精力花費在自己原本要實現的功能上。況且現各種包管理軟體已經做的很完善了。
推薦閱讀:
※OS X (macOS) 有 Arch Linux 好用嗎?
※Mac OS X 中如何使用快捷鍵在模態對話框中導航?
※如何將office2016卸載乾淨?
※MacBook 換 SSD 硬碟後,需要重裝系統嗎?
※Mac 真的比 Windows 更安全嗎?