2010年4月18日 星期日

淺談 debian packaging - 4

上回書說 control 檔裡的幾個重要標籤。整個 debian 的套件管理幾乎可以說是靠這麼少少的數個標籤所撐起來的。那麼延續著 control 檔的話題,這次就先把相依關係更清楚的講解一下,然後談談我個人認為 debian package 管理中最偉大的東西 - 虛擬套件。

我認為最快的學習就是先強記一些基本的概念及關鍵字之後,透過實例或操作來印證。要理解套件之間的相依,最好的工具就是 aptitude 和 synaptics。
俗話說:「沒圖沒真相。」,以下就以一張 aptitude 的螢幕擷圖來實際說明幾個最常用的標籤。

這是在 Ubuntu 9.10 (karmic) 裡,對 apt 這個套件按 Enter (查看詳細資訊)的結果。以下列舉一些相依關係,用比較自話的方式來描述他們。

  • 必須要安裝 libc 2.4 版 (或比 2.4 還新的版本,如 2.4.1、2.5 等等),apt 這個套件裡的東西才能正常執行。
  • apt-doc 裝不裝都可以,有裝有保庇,沒裝無要緊。
  • ubuntu-keyring 最好是裝一下,沒裝的話還是可以執行啦,不過可能需要調整一下、修改個設定檔,或者是某些常用的功能會錯誤一類的。
  • 如果你有裝 libapt-pkg-dev (比 0.3.7 更舊的版本),有一部份的檔案會被 apt 這個套件蓋掉。
  • apt 這個套件會提供 libapt-pkg-libc6.10-6-4.8 這個虛擬套件。
  • 如果你有裝 apt-move 的話,最好裝一下這個 apt。(注意到了嗎,apt-move 是歸類在依賴於 apt 的套件之中的,所以被推薦的是 apt 才對。
看到這邊,喝杯茶思考一下,相信對套件之間的相依關係已經有一幅清晰的圖案浮現了吧。


接下來就是我個人認為的,debian 對於套件管理所提出最偉大的概念:虛擬套件。
顧名思義,虛擬套件並不是任何實際存在的 source 或 binary package。這個觀念不太好講,但我們有 java。

想像我們現在有一個套件叫做 hello-world-in-java,這個套件裡包含了一個用 java 語言撰寫的 hello world 程式。顯然地,只要任何符合 java 標準的 jre/jvm (看不懂這兩個術語也沒關係,這不是本文的重點),都可以讓這個套件能正常的執行及使用。
在 debian 裡,最常見的幾個 jre/jvm 是 gcj、openjdk 和 sun java 三種。那麼我們來思考一下,相依關係要怎麼處理,才能符合上面所說的條件。

是相依在其中的一種嗎(例如 openjdk)?如果只相依 openjdk 的話,代表安裝 sun java 但 沒裝 openjdk 的話,這個套件是不能正常使用或執行的,這顯然不符合我們的條件。
是通通都相依嗎?這樣代表的是三種 jre/jvm 都要安裝,才能正常使用這個套件,當然也與我們的要求不合。

為了解決這個難題,debian 裡有一個虛擬套件叫做 java-runtime,不論是 gcj、openjdk 還是 sun java,都有提供 java-runtime。
openjdk 提供 java-runtime 這句話的意思可以這樣理解:安裝 openjdk 等於安裝 java-runtime。所以 hello-world-in-java 只要相依 java-runtime 就解決了!不管你裝的是 gcj、openjdk 還是 sun java,甚至手癢通通安裝,都可以讓 hello-world-in-java 正常使用。這樣完全符合我們先前列出的條件,可喜可賀!

至此已經把套件間的相依做了簡略但清楚的描繪,下一篇要為各位介紹幾個安裝、刪除、更新套件時的大功臣 - hook scripts。