章 7. 檢査套件中的錯誤

內容目錄

7.1. 詭異可疑的改動
7.2. 校驗軟件包安裝過程
7.3. 檢驗軟件包的 maintainer scripts
7.4. 使用 lintian
7.5. debc 命令
7.6. debdiff 命令
7.7. interdiff 命令
7.8. mc 命令

本教程文件已被重寫為另外的 Debian 維護者指導 文件,其中包含了更新的內容與更多實際例子。請使用新的教程作為主要的教程文件。

在上傳軟件包到公共倉庫前,你還需要知道一些檢查軟件包錯誤的技巧。

不僅在自己的機器上測試總是一個好主意。你必須謹慎地對待以下敘述的測試中顯示的任何一個警告或錯誤信息。

如果你在構建以 3.0 (quilt) 格式的非本土 Debian 軟件包後,發現一個新的自動生成的補丁,比如 debian-changes-*debian/patches 目錄中有可能是你不小心更改了一些文件,或者構建腳本修改了上游源代碼。如果這是你犯下的小錯誤,那就修復它。如果這是構建腳本乾的好事,那就用 dh-autoreconf 來解決其根本問題,可參照 節 4.4.3, “定製 rules 檔案” 或者可以變通一下, 處理 source/options 文件,參照 節 5.24, “source/options.

你必須測試你的軟體包看是否存在安裝問題。debi(1) 命令可以幫助你測試所有生成的二進位制軟體包。

$ sudo debi gentoo_0.9.12-1_i386.changes

你必須使用從 Debian 倉庫下載的 Contents-i386 檔案校驗是否在與不同包存在檔案衝突,以阻止在不同的系統上發生安裝故障。apt-file 命令正適合完成這個任務。如果存在衝突,請透過重新命名、將公共檔案分離到另一個受其他包依賴的包中、與受影響的軟體包的維護者合作使用 alternatives 機制來避免實際問題(參看 update-alternatives(1))或在 debian/control 檔案中設定 Conflicts 條目以宣告衝突關係等方式避免問題的發生。

所有 maintainer scripts,包括 preinstprermpostinstpostrm 文件,都非常難以編寫,除非是由 debhelper 程序自動生成的。如果你是新維護人員則不要使用它們(參看 節 5.18, “{pre,post}{inst,rm})。

如果軟件包使用了這些需要嚴格測試的 maintainer scripts,請確保不僅測試 install,還要測試 remove、purge 和 upgrade。很多 maintainer scripts 的 Bug 都顯現於卸載或徹底刪除軟件包時。使用 dpkg 命令按以下方法來測試它們:

$ sudo dpkg -r gentoo
$ sudo dpkg -P gentoo
$ sudo dpkg -i gentoo_version-revision_i386.deb

整個測試過程應按照以下操作序列完成:

  • 如果可能,安裝前一個版本的套件;

  • 從前一個版本升級套件;

  • 降級套件到前一個版本(可選);

  • 徹底刪除該套件;

  • 全新安裝該套件;

  • 反安裝該套件;

  • 再次安裝該套件。

  • 徹底刪除該套件;

如果這是你的第一個套件,你應該使用其他版本號創建一個測試用的套件來完成升級測試,這樣可以避免將來的問題。

請牢記如果你的套件已經在以往版本的 Debian 中發佈,人們通常會從最近發佈的 Debian 發佈裏的版本升級,所以也要測試從那個版本升級到當前的版本。

儘管降級沒有被正式支持,支持它也總是友好的。

使用 lintian(1) 檢査你的 .changes 檔案。lintian 命令會運行很多測試腳本來檢査常見的打包錯誤。[75]

$ lintian -i -I --show-overrides gentoo_0.9.12-1_i386.changes

當然,要替換你自己軟件包所生成的 .changes 文件的文件名。lintian 命令的輸出常帶有以下幾種標記:

  • E: 代表錯誤:確定違反了 Debian Policy 或是一個肯定的打包錯誤。

  • W: 代表警告:可能違反了 Debian Policy 或是一個可能的打包錯誤。

  • I: 代表信息:對於特定打包類別的信息。

  • N: 代表註釋:幫助你調試的詳細訊息。

  • O: 代表已覆蓋:一個被 lintian-overrides 檔案覆蓋的訊息,但由於使用 --show-overrides 選項而顯示。

對於警告,你應該改進軟件包或者檢查警告是否的確無意義。如果確定沒有意義,則按照 節 5.14, “{package.,source/}lintian-overrides 中的敘述使用 lintian-overrides 文件將其覆蓋。

注意,你可以用 dpkg-buildpackage 來構建軟件包,並執行 lintian,只要你使用了 debuild(1)pdebuild(1).

你可以使用 debc(1) 命令列出一個二進制 Debian 軟件包中的文件。

$ debc package.changes

你可以使用 debdiff(1) 命令比較兩個 Debian 原始碼套件的內容。

$ debdiff old-package.dsc new-package.dsc

你還可以使用 debdiff(1) 命令比較兩個 Debian 二進位套件的檔案列表。

$ debdiff old-package.changes new-package.changes

這個命令對於檢查源代碼包中哪些文件被修改了非常有用,還可以發現二進制包中是否有文件在更新過程中發生的變動,比如被意外替換或刪除。

你可以使用 interdiff(1) 命令比較兩個 diff.gz 檔案。這對於更新使用舊的 1.0 原始碼格式的套件時,檢査是否有意外的變更非常有用。

$ interdiff -z old-package.diff.gz new-package.diff.gz

新的 3.0 源碼格式會將更改保存在多個補丁文件中, 如 節 5.25, “patches/* 所述。 你也可以使用 interdiff 跟蹤 每一個 debian/patches/* 文件中的改動。

很多檔案檢査操作可以通過使用類似 mc(1) 的檔案管理器來完成,它可以幫助你直接査看 *.deb 檔案的內容,除此之外還可以用於 *.udeb*.debian.tar.gz*.diff.gz*.orig.tar.gz 檔案。

還要檢查在二進制包和源代碼包中是否有不需要的文件或者空文件。這些文件經常沒有被正確清理,如果存在這種情況,要調整 rules 文件進行處理。



[75] 如果你按照 節 6.3, “debuild 命令” 中的敘述定義了 /etc/devscripts.conf~/.devscripts 檔案,就不需要再添加 lintian 選項 -i -I --show-overrides