Debian 發行版是基於 Debian 套建管理系統 "dpkg",因此,所有的 Debian 發行版上的套件都必須提供 .deb 格式。
一個 .deb 套件包含了兩個集合的檔案:
第二個集合稱為控制資訊檔案 (control information files),他可能是個維護者腳本 (maintainer scripts),或是一個控制 (control)。一個控制檔案 (control file) 包含特殊的控制欄位可以控制套建行為,其他的控制資訊檔案包含了 symbols 和 shlibs 檔案,用來儲存共享函式庫的相依資訊,以及 conffiles 用來調列套建的設定檔案。
每一個套建名稱必須要有獨特的名稱。這個名稱會被包含在控制檔案的 Package 欄位中,且也會包含在 .deb 檔名的一部份。
每一個套建都會有一個版本數字記錄在控制檔案的 Version 欄位中。
套建管理系統使用版本資訊來了解一個套件是否要升級或是降級,如此一來套建系統的前端應用便能尋找是否有比目前已安裝套件更新的版本。
一般來說,Debian 套件應該使用和上游來源 (upstream soruce) 。但是上游的版本數字可能基於特殊日期格式或是特定的快照資訊,而不能被套建管理系統正確的使用。例如 dpkg 會把 "96May01" 認為是 "96Dec24" 的升級版。
為了避免每次上游更新時都要修改,應該以適當的方法針對上游的日期資訊進行修改:四個數字的年份,接著兩個數字的月份以及兩個數字的日期,並可能用分格符號進行分隔。
原生的 Debian 套件的版本也應該要遵照這個規則,且期望要使用分格符號,分號 (-) 和點 (.) 都是好選擇。
每一個套件都必須要有維護人 (maintainer),除了某些孤兒套件例外。 維護人可以是一個人也可以是一個群體,必須要可以 email 連絡,例如 mailing list。維護人負責維護套件檔案、評估與適當的回應回報的 Bug、上傳新版本的套件 (直接上傳或透過贊助者)、確保套件被放置在正確的位置、確保套件有良好的穩定性與效用,以及在套件不在維護時從 Debian 發行版中移除。
維護人員必須指定在控制檔案中的 Maintainer 欄位,包含正確的名稱與可連絡的電子郵件位置。此電子郵件位置必須要可以接受來自 Debian 發送關於此套件的自動郵件,包含了來自 Bug 追蹤追蹤的信件、來自 Debian 檔案庫 (archive) 維護軟體和其他角色帳號或自動處理的郵件。若一個維護人或維護團隊同時維護了多個套件,則應該在套件間使用相同的名稱與電子信箱位置。
若一個套件的維護人員是共用一個電子信箱位置的團隊則在 Uploaders 控制檔案欄位應該至少要填寫一個獨立的人員與他們的個人電子信箱。
一個孤兒套件是不再被維護的套件,這種類型套件的 Maintainer 空置欄位須被設成 Debian QA Group ' <packages@qa.debian.org> 。這些套件可以被是為由 Debian 來維護直到有人或志願者協助進行維護。
每一個套件都需要有 Description 控制欄位,包含套件的大綱描述和延伸描述。
套件描述中的敘述需要提供沒有用過此套件的使用者(通常是系統管理員) 足夠的資訊,讓他們決定是否要進行安裝。因此,這個描述不應該只是從程式開發文件複製過來的敘述。
套件描述應該優先描述重要的資訊,因為在某些狀況下,只有第一部份的大鋼會被顯示。你應該要假設使用者會有辦法可以看到完整的敘述。
套件描述也應該包含和其他套件的相依關係或是衝突關係,這樣一來使用者才知道為什麼這些相依和衝突套件會被進行限制。
然而,如何設定套件或使用套件的描述則不應該包含在套件描述中。版權升名和其他管理資訊也不該被包含其中。
單行大鋼應該要盡可能的簡短,基本上不超過 80 個字。
不要包含套件名稱在敘述中,套件管理系統之道如何顯示套件名稱,因此你不需要手動的標是他們。 請記得在多數狀況下使用者只會看到單行描述,請確定此敘述具備足夠的描述性。
不要在延伸敘述中繼續單行大綱的描述,這會在完整描述被顯示時造成不正確的結果,並可能產生沒有意義的大綱描述。
延伸敘述應該描述此套件所做的事情以及它與其他系統的相關性。
敘述欄位的讀者是任何人,即使使用者對於這個套件所處理的事物毫無理解,他們也應該能了解套件的用途。
每一個套件都必須要指定相依性資訊,用於描述此套件在運作時所需要的其他套件。舉例來說,套件中的執行檔動態連結所需要的共享函式庫應該要被列在相依性欄位中。
相依於一個被標記成 Essential 的套件不需要宣告相依性關係,只有少數的套件會被標記為 essential ,例如套件間發生了迴圈而造成無法解決的相依性關係。
有些時候解封裝(unpack)一個套件需要其他套件先被解封裝與設定,在這種狀況下,此套件可以描述此相依性關係在 Pre-Depends 控制欄位中。
你應該在 debian-devel mailing list 中討論並得到結論後才在 Pre-Depends 中增加相依性關係。
多個套件可能或多或少的提供相同的功能,在這種狀況下,定義一個虛擬套件 (virtual package) 可以有效的描述這個共用的功能。(一個虛擬套件只是邏輯上的存在,而不是實體上的,這也是為什麼它會被稱為 虛擬) 一個套件可以提供某個虛擬套件所要求的功能性時,則它可以做為此虛擬套件的實體套件。當其他套件需要此功能時,它可以簡單的相依於虛擬套件而不用指定所有可能的實體套件。
所有的套件都應該要適當的使用虛擬套件名稱,並在在需要新名稱進行合理的調整。一個套件不該使用虛擬套件名稱 (除非它是一個內部使用的套件) 除非他們被同意且條列在虛擬套件清單中。
最新的官方虛擬套件清單可以在 debian-policy 套件中找到,你也可以在 Debian 網站鏡像中取得 http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt 。
如何更新此清單亦描述在此清單中。
基礎系統 (basic system) 是一個最小的 Debian 系統子集合,必須要在一個新系統安裝任何東西前被安裝。只有少數的套件會被列為基礎系統,用來確保硬碟空間需求可以盡可能的小。
基礎系統包含了所有優先權被標記為 required 和 important 的套件。大部分這些套建會被標記為 essential。
基本 (Essential) 被定義為一個功能性的最小集合,必須在系統上總是可見且可用,甚至是套件處於 "Unpacked" 狀態。一個套件使用 Essential 空置欄位被標記為 essential。
由於這些套件不可能被輕易的移除 (至少需要對 dpkg 使用而外的 force 選項),這個標記選像應該只有在非常必須的狀況下才使用。一個共用函式庫套件不能被標記為 essential,相依性會造成這個套件無法被過早的移除,而我們確有可能在此套件被取代時要移除它。
由於 dpkg 不會在 essential 套件處於未設定(unconfigured)狀態時阻止其他套件升級,因此所有的 essential 套件必須要確保核心功能在位設定狀態下亦可以正常運作。若一個套件無法滿足這個要求,則其不該被標記為 essential,且其他要使用到此套件的套件,則必須要在各自的相依性清單中顯式的清楚描述。
維護人員應該非常小心的新增程式、介面或功能到 essential 套件中。其他套件可能會假設由 essential 套件所提供的功能是總是存在的而沒有顯式描述相依關係,這也代表了從 essential 套件中移除功能會式非常困難的,或是幾乎不會發生的事情。任何加入 essential 套件的能力帶表了增加了去維護該能力的永久義務。
你不該在 debian-devel mailing list 討論並獲得結論前對一個套件增加 essential 標記。
一個套件安裝腳本應該避免產生不必要的輸出訊息給使用者,且應該依來於 dpkg 來避免在使用者安裝大量套件時造成干擾。這代表著除非有特殊要求,不要傳遞 --verbose 選項給 update-alternatives。
執行安裝腳本時的錯誤都應該要被檢查並且在產生錯誤後不繼續執行。
套件維護人腳本在需要時可以提示 (prompt) 使用者資訊。提示必須要透過程式通訊來完成,例如 debconf,遵守 Debian Configuration Management Sepecification 第二版或更高版本。
Essential 套件或相依於 essential 的套件,若在執行時沒有適合的介面可以使用,可以 fall back 回使用其他提示方法。
Debian Configuration Management Sepecification 包含在 debconf_specification 檔案於 debian-policy 套件中。也可以於 Debian Web 鏡像中取得 http://www.debian.org/doc/packaging-manuals/debconf_specification.html
使用 Debian Configuration Management Sepecification 的套件可能會包含而外的控制檔案 config 和 templates。 config 是一個而外的維護人腳本用來設定套件,而 templates 包含了用來提示使用者的範本。config 腳本可能會在 preinst 腳本前執行、在套件解封裝前或任何相依性或 pre-dependencies 完成前。 因此 config 腳本必須指依賴於 essential 套件所提供的工具。
使用 Debian Configuration Management Sepecification 的套件必須要允許使用者可見訊息被翻譯,例如使用 po-debconf 套件所提供的工具或其他 gettext-based 系統。
一個套件應該鏡可能的減少需要的提示次數,並且應該確保每一個問題只會詢問使用者一次。這代表著套件應該嘗試使用者設定好的偏好資訊,如 /etc/papersize 或 /etc/news/server,並共享 debconf 變數而不是不斷使用提示來獲取片段資訊。
這也代表著升級時不該要在詢問是用者相同的訊息,除非使用者使用了 dpkg --purge 來移除套件的設定。使用者設定後的結果應該要儲存在 /etc 中適當的位置,讓使用者可以進行修改,且修改方式應該以文件記錄。
若一個套件有相當重要的資訊需要提供給使用者,其應該在 config 或 postinst 腳本中提示並要求使用者輸入確認訊息收到。版權訊息不應該被包含在重要訊息中 (可以放置於 /usr/share/doc/package/copyright),如何使用程式的訊息也不應該被包含其中。
任何必要的提示應該總是在 config 或 postinst 腳本中出現,若是在 postinst 中提示,則應該被一些條件保護,避免在安裝失敗時出現,如 postinst 收到參數 abort-upgrade, abort-remove 或 abort-deconfigure