Linux系統和windows都是操作系統,為什麼Linux沒有形成統一的軟體包格式,而是出現deb,rpm,二進位包和源碼包這樣的多種包格式並存的局面?


linux社區是春秋戰國時代。都尊奉周天子不假,但是內政還是自己管。軟體開發者就是諸子百家,有的佩六國相印,有的窮乎陳蔡之間。

deb是debian國開發並行之有效的,於是被相友的ubuntu等國採用,rpm是redhat國的,suse等國覺得可以紹述。

僅此而已。


因為Linux 從來就不是一個整體,其內部分為許多發行版,不同的發行版有不同的包管理機制。而那些deb,rpm其實沒有本質上的區別,把它們解開看看就明白了。


不專業的說,軟體包文件到底是個啥呢。對於Linux下的軟體包來說,它實際上包含了:

  1. 軟體包本身,也就是開發者或者打包者針對這個系統編譯出來的可以直接拿給用戶使用的所需的全部文件。
  2. 一些額外的描述文件,包括軟體包的信息、依賴、文件列表、校驗碼等等。

以上這些內容,我們把它打包壓縮起來,就可以作為軟體包分發給用戶使用了。但是不同的發行版對於如何組織這些文件,使用什麼樣的壓縮格式,描述文件如何組織,描述文件包含什麼內容等等並沒有一致的意見。而且對於一個軟體包,打包的適合是否需要拆包也有不同的看法,一些發行版認為需要把foobar拆分為libforbar, libfoorbar-dev, foobar-doc之類的,把頭文件和文檔拆分出來,可以節省空間啊啥的,用戶也可能並不需要這些頭文件或者文檔,只要軟體包本身。而一些發行版認為我盡量尊重上游,一個軟體對應我發行版里的一個包,雖然多佔用硬碟空間,但是勝在簡單粗暴啊。總之是各有各的看法。

此外呢,即使是Linux系統,不同的發行版對於文件系統目錄樹也有不同的看法。比如ArchLinux就把/usr/lib和/usr/lib64合併了,但是有的就不是這麼做的。而且即使是相同的軟體包,比如apache,有的發行版實際的包名是apache2,然後對應的systemd服務有叫apache2的,還有叫做httpd的。而運行apache2這個服務的用戶,有叫http的,還有叫www的。根本就不統一啊。這個分類真的是到處存在的。

總之是各有個的想法,各有各的取捨。

如果想要統一一下,也不是沒有可能。但是恐怕很難有一個強有力的公司/機構去推動這件事情,也很難有一個能讓大家都信服的方案去實現它。開源/自由嘛,一言不合就可以fork一個分支出來,慢慢地發展之後就又分裂了。


Windows也是多種包格式並存哦。參見exe,msi,cab等等。

發行版的包管理系有些甚至是可以相互轉換的(alien),rpm繫上可以用apt。

Windows相當於給了你一個螺絲孔,軟體包是一個有對應螺紋的螺絲。

Linux不同的發行版有不同的螺絲孔,此外,還給了你一桶鐵水,你可以自己做螺絲模子,也可以直接把鐵水灌進螺絲孔去。


Linux沒有統一的包格式可能有兩個方面的原因:

  1. Linux kernal的是開源的,每一個發行版對於不同的利益訴求,選擇不同的包管理策略。
  2. 沒有谷歌這樣有影響力的公司或者企業。缺少對各個發行版的影響。

當然,統一包格式,對於使用者和開發者來說都是好事一件,你看android系統就是如此。好多廠家都是使用的android系統定製不同的UI和功能,但是你包都必須的是apk.


  1. 沒有統一的發行版
  2. 有的發行版有自己的個性化目錄結構,統一不了


包管理,最重要的是版本管理。

看著這麼多格式,工具 ,其實本質是一樣的,換不同的包管理器,你就當多學了一條shell命令不就行了。

我感覺這些不同的東西存在是挺好的。

之所以沒有被統一,可能是還沒有一個能統領群雄的角色出來吧。

對linux來說,多樣性不挺好的么。

你不要比較,找一個喜歡的玩就行了。


大同小異吧。deb和rpm都是有著特殊文件編排方式的zip包。arch系pacman的包倒是少見的不用zip而用.tar.xz的。gentoo的emerge更乾脆,就是個類Makefile。

然後任何二進位包都是在一個乾淨的發行版bootstrap容器C里,部署上某個軟體形成C後,對比C和C的差異後形成的補丁ΔC。所以從這個意義上來看,只要不是二進位發行和源碼發行的差異,都沒有區別。


Linux 系統多了,每個發行版都是一個 Linux 系統,不同的系統選擇不同的包格式有什麼不妥嗎?而且每個系統都只推薦你用它自己的那個格式,問題是最少的,其他的用戶自己亂裝出問題當然是用戶自己的問題啦,系統可沒讓你用這個。

我倒是很想問問,為什麼 Windows 作為一個系統,安裝包有 exe、msi、甚至還有一些 rar 解壓的綠色軟體、還有 Windows Store 這麼多種安裝方式呢?明明看起來只有 msi 是微軟設計的安裝包格式嘛。為什麼有時候裝個 XXX 程序,還得自己去搜索安裝什麼 .NET Framework 20XX、Visual C++ Runtime XX 呢?既然用 Windows 的時候對這些都沒抱怨地學習和接受了,一個 Linux 發行版只有一種的軟體安裝方式學習一下也應該不是什麼大難題嘛,更何況有好幾個發行版用的還是同樣的格式。

有時候我都懷疑是不是 Linux 下面編譯軟體太容易了,怎麼那麼多不合格教程一上來就教人家用源碼包編譯安裝的,用 Linux 之前還是最好搞清楚去哪裡查有用的文檔,對自己對大家都好,畢竟官方文檔一般還是挺全的,而且一般比知乎提問得到的結果更靠譜,效率也更高。要不是 Windows 下面編個軟體配個環境巨麻煩,是不是還得有一大堆不靠譜教程教別人 Windows 下從源碼包裝軟體啊。


因為是不同團隊互相看著對方不爽,實際上都是垃圾,目前稍微好一點的也就snapcaft。

社區機制對行業沒什麼洞察能力,大部分用戶關心的是軟體是否可用,而不是在那裡節約一點點硬碟空間和解決無休止的依賴問題。

而像紅帽、suse這些廠商本身有能力解決這些問題的,但是他們面向的客戶又不是普通用戶,必須要搞點特性出來賣產品,分出點人力給建設社區已經夠給面子了。


linux有統一的軟體包格式呀。那就是tar包嘛,每個linux下面都統一了,都兼容。

至於你說的rpm,deb...那些包是在源碼包的基礎上加了一層包裝,讓使用的人更容易安裝。


推薦閱讀:
相关文章